@nathanfaucett/parallel
Version:
parallel for the browser and node.js
38 lines (31 loc) • 1.02 kB
JavaScript
var keys = require("@nathanfaucett/keys"),
once = require("@nathanfaucett/once"),
asyncDone = require("@nathanfaucett/async_done"),
objectValues = require("@nathanfaucett/values").objectValues,
arrayForEach = require("@nathanfaucett/array-for_each"),
throwIfNotFunction = require("./throwIfNotFunction");
module.exports = fromObject;
function fromObject(tasks) {
var taskNames = keys(tasks),
taskValues = objectValues(tasks, taskNames),
taskLength = taskValues.length;
arrayForEach(taskValues, throwIfNotFunction);
return function runObject(callback) {
var onceCallback = once(callback),
results = {},
count = taskLength;
function onResult(error, key, result) {
results[key] = result;
if (error) {
onceCallback(error, results);
} else if (--count === 0) {
onceCallback(undefined, results);
}
}
arrayForEach(taskValues, function each(task, index) {
asyncDone(task, function onAsyncDone(error, result) {
onResult(error, taskNames[index], result);
});
});
};
}