Metasync — асинхронная композиция
Библиотека Metarhia для асинхронного программирования: композиция функций, коллекторы, очереди, примитивы. Альтернатива async/await + библиотеке
async.
Зачем
автор: callback'и быстро, но pyramid of doom. async/await удобно, но «теряется понимание, что происходит». Библиотека async тоже строит пирамиды. Нужны композиторы.
Контракт error-first callback
Стандартный Node-контракт:
fn(arg1, arg2, (err, result) => { ... });
- callback — последний аргумент
- error — первый аргумент в callback
- data — второй
Metasync использует и расширяет этот контракт.
Композиция функций
const sequential = metasync.sequential([fn1, fn2, fn3]);
const parallel = metasync.parallel([fn1, fn2, fn3]);
sequential((err, result) => { /* ... */ });
parallel((err, result) => { /* ... */ });
sequential— выполнить по очереди.parallel— параллельно, ждать все.composition— DAG из функций с зависимостями.
Коллекторы
Собирают результаты нескольких асинхронных операций.
const dc = metasync.collect(3);
dc.pick('user', userData);
dc.pick('posts', postsData);
dc.pick('comments', commentsData);
dc.done((err, data) => {
// data.user, data.posts, data.comments
});
collect(N)— ждёт N значений.collect(keys)— ждёт по ключам.
Async-очередь
const queue = metasync.queue(concurrency);
queue.add(task);
queue.add(task);
// выполняются с лимитом concurrency
С приоритетами, паузой, drain-событиями.
Примитивы
do— chain функций.each/eachSeries— итерация массива.map/mapSeries— преобразование с асинхронной функцией.reduce— свёртка асинхронно.memoize— кэширование с асинхронным getter.throttle,debounce— стандартные.
Чем лучше Promise
- Контроль над flow — не теряется явность как с await.
- Композиция — можно строить графы зависимостей (DAG), не только sequential/parallel.
- Меньше боли с обработкой ошибок — error-first callback'и стандартизированы.
В современном коде многое уже делается через async/await. Metasync остаётся для сложной координации.
🎓 Источники
- 🎓 Архив 2017 — MetaSync · 2019-12-28
- Цитата: «Metasync — это библиотека для синхронного программирования, которая содержит целый ряд абстракций.»