diff options
author | Alexander Early <alexander.early@gmail.com> | 2016-02-27 16:30:40 -0800 |
---|---|---|
committer | Alexander Early <alexander.early@gmail.com> | 2016-02-27 16:30:40 -0800 |
commit | 73163c892b1f0f92b03ed47f4379dd0fb649a6a2 (patch) | |
tree | 7327872b3f87141a2144c8c3529d4eaeae591082 | |
parent | 5be644c3c2d913662c24e3fb2fae9f27bf58af21 (diff) | |
download | async-73163c892b1f0f92b03ed47f4379dd0fb649a6a2.tar.gz |
make tests pass
-rw-r--r-- | lib/auto.js | 52 | ||||
-rw-r--r-- | mocha_test/auto.js | 8 |
2 files changed, 39 insertions, 21 deletions
diff --git a/lib/auto.js b/lib/auto.js index 327383b..21fbb08 100644 --- a/lib/auto.js +++ b/lib/auto.js @@ -34,13 +34,16 @@ export default function (tasks, concurrency, callback) { var hasError = false; 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.slice(), function (fn) { @@ -77,37 +80,52 @@ export default function (tasks, concurrency, callback) { setImmediate(taskComplete); } }); + var requires = task.slice(0, task.length - 1); - // prevent dead-locks - var len = requires.length; - var dep; - while (len--) { - if (!(dep = tasks[requires[len]])) { - throw new Error('Has non-existent dependency in ' + - requires.join(', ')); - } - if (isArray(dep) && indexOf(dep, k) >= 0) { - throw new Error('Has cyclic dependencies'); + + checkForDeadlocks(); + + if (ready()) { + startNext(); + } else { + addListener(listener); + } + + function checkForDeadlocks() { + var len = requires.length; + var dep; + while (len--) { + if (!(dep = tasks[requires[len]])) { + throw new Error('Has non-existent dependency in ' + + requires.join(', ')); + } + if (isArray(dep) && indexOf(dep, k) >= 0) { + throw new Error('Has cyclic dependencies'); + } } } + function ready() { return runningTasks < concurrency && !baseHas(results, k) && arrayEvery(requires, function (x) { return baseHas(results, x); }); } - if (ready()) { + + function startNext() { runningTasks++; - task[task.length - 1](taskCallback, results); - } - else { - addListener(listener); + var taskFn = task[task.length - 1]; + if (requires.length > 0) { + taskFn(results, taskCallback); + } else { + taskFn(taskCallback); + } } + function listener() { if (ready()) { - runningTasks++; removeListener(listener); - task[task.length - 1](taskCallback, results); + startNext(); } } }); diff --git a/mocha_test/auto.js b/mocha_test/auto.js index d0141bb..cc80aed 100644 --- a/mocha_test/auto.js +++ b/mocha_test/auto.js @@ -263,15 +263,15 @@ describe("auto", function () { // Issue 462 on github: https://github.com/caolan/async/issues/462 it('auto modifying results causes final callback to run early', function(done) { async.auto({ - task1: function(callback, results){ - results.inserted = true; + task1: function(callback){ callback(null, 'task1'); }, - task2: function(callback){ + task2: ["task1", function(results, callback){ + results.inserted = true; setTimeout(function(){ callback(null, 'task2'); }, 50); - }, + }], task3: function(callback){ setTimeout(function(){ callback(null, 'task3'); |