56 lines
1.1 KiB
JavaScript
56 lines
1.1 KiB
JavaScript
/*! run-parallel. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
|
|
module.exports = runParallel;
|
|
|
|
const queueMicrotask = require('queue-microtask');
|
|
|
|
function runParallel(tasks, cb) {
|
|
let results, pending, keys;
|
|
let isSync = true;
|
|
|
|
if (Array.isArray(tasks)) {
|
|
results = [];
|
|
pending = tasks.length;
|
|
} else {
|
|
keys = Object.keys(tasks);
|
|
results = {};
|
|
pending = keys.length;
|
|
}
|
|
|
|
function done(err) {
|
|
function end() {
|
|
if (cb) cb(err, results);
|
|
cb = null;
|
|
}
|
|
if (isSync) queueMicrotask(end);
|
|
else end();
|
|
}
|
|
|
|
function each(i, err, result) {
|
|
results[i] = result;
|
|
if (--pending === 0 || err) {
|
|
done(err);
|
|
}
|
|
}
|
|
|
|
if (!pending) {
|
|
// empty
|
|
done(null);
|
|
} else if (keys) {
|
|
// object
|
|
keys.forEach(function (key) {
|
|
tasks[key](function (err, result) {
|
|
each(key, err, result);
|
|
});
|
|
});
|
|
} else {
|
|
// array
|
|
tasks.forEach(function (task, i) {
|
|
task(function (err, result) {
|
|
each(i, err, result);
|
|
});
|
|
});
|
|
}
|
|
|
|
isSync = false;
|
|
}
|