Metasync
Asynchronous Programming Library for JavaScript & Node.js 🔁
Install / Use
/learn @metarhia/MetasyncREADME
Asynchronous Programming Library
Installation
$ npm install metasync
Asynchronous functions composition
metasync(fns)(data, done)
fns- array of callback-last functions, callback contranct err-firstdata- input data (optional)done- err-first callback- Returns: composed callback-last / err-first function

const composed = metasync([f1, f2, f3, [[f4, f5, [f6, f7], f8]], f9]);
- Array of functions gives sequential execution:
[f1, f2, f3] - Double brackets array of functions gives parallel execution:
[[f1, f2, f3]]
Example:
const metasync = require('metasync');
const fs = require('fs');
// Data collector (collect keys by count)
const dc = metasync.collect(4);
dc.pick('user', { name: 'Marcus Aurelius' });
fs.readFile('HISTORY.md', (err, data) => dc.collect('history', err, data));
dc.take('readme', fs.readFile, 'README.md');
setTimeout(() => dc.pick('timer', { date: new Date() }), 1000);
// Key collector (collect certain keys by names)
const kc = metasync
.collect(['user', 'history', 'readme', 'timer'])
.timeout(2000)
.distinct()
.done((err, data) => console.log(data));
kc.pick('user', { name: 'Marcus Aurelius' });
kc.take('history', fs.readFile, 'HISTORY.md');
kc.take('readme', fs.readFile, 'README.md');
setTimeout(() => kc.pick('timer', { date: new Date() }), 1000);
API
callbackify(fn)
fn: [<Function>][function] promise-returning function
Returns: [<Function>][function]
Convert Promise-returning to callback-last / error-first contract
asyncify(fn)
fn: [<Function>][function] regular synchronous function
Returns: [<Function>][function] with contract: callback-last / error-first
Convert sync function to callback-last / error-first contract
promiseToCallbackLast(promise, callback)
promise: [<Promise>][promise]callback: [<Function>][function]
Convert Promise to callback-last
promisify(fn)
fn: [<Function>][function] callback-last function
Returns: [<Function>][function] Promise-returning function
Convert async function to Promise-returning function
promisifySync(fn)
fn: [<Function>][function] regular synchronous function
Returns: [<Function>][function] Promise-returning function
Convert sync function to Promise object
map(items, fn, done)
items: [<Array>][array] incomingfn: [<Function>][function] to be executed for each value in the arraycurrent:<any>current element being processed in the arraycallback: [<Function>][function]err: [<Error>][error]|[<null>][null]value:<any>
done: [<Function>][function] on doneerr: [<Error>][error]|[<null>][null]result: [<Array>][array]
Asynchronous map (iterate parallel)
filter(items, fn, done)
items: [<Array>][array] incomingfn: [<Function>][function] to be executed for each value in the arrayvalue:<any>item from items arraycallback: [<Function>][function]err: [<Error>][error]|[<null>][null]accepted: [<boolean>][boolean]
done: [<Function>][function] on doneerr: [<Error>][error]|[<null>][null]result: [<Array>][array]
Asynchrous filter (iterate parallel)
Example:
metasync.filter(
['data', 'to', 'filter'],
(item, callback) => callback(item.length > 2),
(err, result) => console.dir(result),
);
reduce(items, fn, done[, initial])
items: [<Array>][array] incomingfn: [<Function>][function] to be executed for each value in arrayprevious:<any>value previously returned in the last iterationcurrent:<any>current element being processed in the arraycallback: [<Function>][function] callback for returning value back to reduce functionerr: [<Error>][error]|[<null>][null]data:<any>resulting value
counter: [<number>][number] index of the current element being processed in arrayitems: [<Array>][array] the array reduce was called upon
done: [<Function>][function] on doneerr: [<Error>][error]|[<null>][null]result: [<Array>][array]
initial:<any>optional value to be used as first argument in first iteration
Asynchronous reduce
reduceRight(items, fn, done[, initial])
items: [<Array>][array] incomingfn: [<Function>][function] to be executed for each value in arrayprevious:<any>value previously returned in the last iterationcurrent:<any>current element being processed in the arraycallback: [<Function>][function] callback for returning value back to reduce functionerr: [<Error>][error]|[<null>][null]data:<any>resulting value
counter: [<number>][number] index of the current element being processed in arrayitems: [<Array>][array] the array reduce was called upon
done: [<Function>][function] on doneerr: [<Error>][error]|[<null>][null]result: [<Array>][array]
initial:<any>optional value to be used as first argument in first iteration
Asynchronous reduceRight
each(items, fn, done)
items: [<Array>][array] incomingfn: [<Function>][function]value:<any>item from items arraycallback: [<Function>][function]err: [<Error>][error]|[<null>][null]
done: [<Function>][function] on doneerr: [<Error>][error]|[<null>][null]items: [<Array>][array]
Asynchronous each (iterate in parallel)
Example:
metasync.each(
['a', 'b', 'c'],
(item, callback) => {
console.dir({ each: item });
callback();
},
(err, data) => console.dir('each done'),
);
series(items, fn, done)
items: [<Array>][array] incomingfn: [<Function>][function]value:<any>item from items arraycallback: [<Function>][function]err: [<Error>][error]|[<null>][null]
done: [<Function>][function] on doneerr: [<Error>][error]|[<null>][null]items: [<Array>][array]
Asynchronous series
Example:
metasync.series(
['a', 'b', 'c'],
(item, callback) => {
console.dir({ series: item });
callback();
},
(err, data) => {
console.dir('series done');
},
);
find(items, fn, done)
items: [<Array>][array] incomingfn: [<Function>][function]value:<any>item from items arraycallback: [<Function>][function]err: [<Error>][error]|[<null>][null]accepted: [<boolean>][boolean]
done: [<Function>][function] on doneerr: [<Error>][error]|[<null>][null]result:<any>
Asynchronous find (iterate in series)
Example:
metasync.find(
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
(item, callback) => callback(null, item % 3 === 0 && item % 5 === 0),
(err, result) => {
console.dir(result);
},
);
every(items, fn, done)
items: [<Array>][array] incomingfn: [<Function>][function]value:<any>item from items arraycallback: [<Function>][function]err: [<Error>][error]|[<null>][null]accepted: [<boolean>][boolean]
done: [<Function>][function] on doneerr: [<Error>][error]|[<null>][null]result: [<boolean>][boolean]
Asynchronous every
some(items, fn, done)
items: [<Array>][array] incomingfn: [<Function>][function]value:<any>item from items arraycallback: [<Function>][function]err: [<Error>][error]|[<null>][null]accepted: [<boolean>][boolean]
done: [<Function>][function] on doneerr: [<Error>][error]|[<null>][null]result: [<boolean>][boolean]
Asynchronous some (iterate in series)
asyncMap(items, fn[, options][, done])
items: [<Array>][array] incoming datasetfn: [<Function>][function]item:<any>index: [<number>][number]
options: [<Object>][object] map params, optionalmin: [<number>][number] min number of items in one next callpercent: [<number>][number] ratio of map time to all time
done: [<Function>][function] call on done, optionalerr: [<Error>][error]|[<null>][null]result: [<Array>][array]
Non-blocking synchronous map
asyncIter(base)
base: [<Iterable>][iterable]|[<AsyncIterable>][asynciterable] an iterable that is wrapped in [<AsyncIterator>][asynciterator]
Returns: [<AsyncIterator>][asynciterator]
Create an AsyncIterator instance
class AsyncIterator
AsyncIterator.prototype.constructor(base)
async AsyncIterator.prototype.next()
async AsyncIterator.prototype.count()
async AsyncIterator.prototype.each(fn, thisArg)
async AsyncIterator.prototype.forEach(fn, thisArg)
async AsyncIterator.prototype.parallel(fn, thisArg)
async AsyncIterator.prototype.every(predicate, thisArg)
async AsyncIterator.prototype.find(predicate, thisArg)
async AsyncIterator.prototype.includes(element)
async As
Related Skills
node-connect
340.2kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
84.1kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
340.2kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
commit-push-pr
84.1kCommit, push, and open a PR
