async-parallel-impl
implementation of async parallel
by upigilam
JavaScript
/**
* async.parallel()
*/
function parallel(tasks, finalCb = () => null) {
if (!Array.isArray(tasks)) {
throw new TypeError('First arg must be an array');
}
if (typeof finalCb !== 'function') {
finalCb = () => null;
}
const results = [];
let numReturned = 0;
let hasFinalCbBeenCalled;
tasks.forEach((task, i) => {
if (typeof task !== 'function') {
throw new TypeError('Tasks must be functions');
}
console.log('task :: ', task);
task((err, result) => {
if (err) {
// We only want finalCb to be called once
if (!hasFinalCbBeenCalled) {
hasFinalCbBeenCalled = true;
finalCb(err);
}
return;
}
results[i] = result;
numReturned++;
if (numReturned === tasks.length) {
finalCb(null, results);
}
});
});
}
// Calling it:
const fns = [
fn1 = (cb) => setTimeout(() => cb(null, 'success after 700ms'), 700),
fn2 = (cb) => setTimeout(() => cb(null, 'success after 200ms'), 200),
fn3 = (cb )=> setTimeout(() => cb(null, 'success after 300ms'), 500),
];
parallel(fns, (err, results) => {
if(err) {
console.log('error: ', err);
} else {
console.log('results :: ',results)
}
/// results = ['700', '200', '300']
});