diff options
author | Graeme Yeates <yeatesgraeme@gmail.com> | 2015-12-23 18:29:52 -0500 |
---|---|---|
committer | Graeme Yeates <yeatesgraeme@gmail.com> | 2015-12-29 16:48:48 -0500 |
commit | 1448f24a5e7d5c4b9ff56ef573d35291511c2a71 (patch) | |
tree | 3efbaea4ef8ac80ef7c37bf1bcbdeeee5dd7dd81 /lib/auto.js | |
parent | 18e61d4f07f48604601f2effdbe2a7e188d14d4a (diff) | |
download | async-1448f24a5e7d5c4b9ff56ef573d35291511c2a71.tar.gz |
Fix implementations (test green lights)
Diffstat (limited to 'lib/auto.js')
-rw-r--r-- | lib/auto.js | 45 |
1 files changed, 21 insertions, 24 deletions
diff --git a/lib/auto.js b/lib/auto.js index e48735c..82ad468 100644 --- a/lib/auto.js +++ b/lib/auto.js @@ -1,28 +1,28 @@ 'use strict'; import arrayEach from 'lodash/internal/arrayEach'; +import arrayEvery from 'lodash/internal/arrayEvery'; import forOwn from 'lodash/object/forOwn'; import indexOf from 'lodash/array/indexOf'; import isArray from 'lodash/lang/isArray'; -import keys from 'lodash/object/keys'; +import okeys from 'lodash/object/keys'; import noop from 'lodash/utility/noop'; import once from 'lodash/function/once'; import restParam from 'lodash/function/restParam'; -import reduce from './reduce'; import setImmediate from './internal/setImmediate'; -export default function auto(tasks, concurrency, cb) { +export default function (tasks, concurrency, callback) { if (typeof arguments[1] === 'function') { // concurrency is optional, shift the args. - cb = concurrency; + callback = concurrency; concurrency = null; } - cb = once(cb || noop); - var okeys = keys(tasks); - var remainingTasks = okeys.length; + callback = once(callback || noop); + var keys = okeys(tasks); + var remainingTasks = keys.length; if (!remainingTasks) { - return cb(null); + return callback(null); } if (!concurrency) { concurrency = remainingTasks; @@ -32,31 +32,28 @@ export default function auto(tasks, concurrency, cb) { var runningTasks = 0; var listeners = []; - function addListener(fn) { listeners.unshift(fn); } - function removeListener(fn) { var idx = indexOf(listeners, fn); if (idx >= 0) listeners.splice(idx, 1); } - function taskComplete() { remainingTasks--; - arrayEach(listeners, function(fn) { + arrayEach(listeners.slice(), function (fn) { fn(); }); } - addListener(function() { + addListener(function () { if (!remainingTasks) { - cb(null, results); + callback(null, results); } }); - arrayEach(okeys, function(k) { - var task = isArray(tasks[k]) ? tasks[k] : [tasks[k]]; + arrayEach(keys, function (k) { + var task = isArray(tasks[k]) ? tasks[k]: [tasks[k]]; var taskCallback = restParam(function(err, args) { runningTasks--; if (args.length <= 1) { @@ -68,8 +65,9 @@ export default function auto(tasks, concurrency, cb) { safeResults[rkey] = val; }); safeResults[k] = args; - cb(err, safeResults); - } else { + callback(err, safeResults); + } + else { results[k] = args; setImmediate(taskComplete); } @@ -86,19 +84,18 @@ export default function auto(tasks, concurrency, cb) { throw new Error('Has cyclic dependencies'); } } - function ready() { - return runningTasks < concurrency && reduce(requires, function(a, x) { - return (a && results.hasOwnProperty(x)); - }, true) && !results.hasOwnProperty(k); + return runningTasks < concurrency && arrayEvery(requires, function (x) { + return results.hasOwnProperty(x); + }) && !results.hasOwnProperty(k); } if (ready()) { runningTasks++; task[task.length - 1](taskCallback, results); - } else { + } + else { addListener(listener); } - function listener() { if (ready()) { runningTasks++; |