diff options
author | Caolan McMahon <caolan.mcmahon@gmail.com> | 2014-03-30 12:41:44 +0100 |
---|---|---|
committer | Caolan McMahon <caolan.mcmahon@gmail.com> | 2014-03-30 12:41:44 +0100 |
commit | 9dab0ca39a12e5f10630a6949bd1552bc2733d57 (patch) | |
tree | b8d063302b3041511aefe39aac34c4967161be78 | |
parent | 28697107d8821a8f3501143a87c9a341e3e9140a (diff) | |
parent | f1f9bfe9950b126da81ee3fe6bd16d891138ab87 (diff) | |
download | async-9dab0ca39a12e5f10630a6949bd1552bc2733d57.tar.gz |
Merge pull request #473 from jessehouchins/auto-task-tracking
Track auto tasks using a counter results can be inserted/removed dynamically
-rwxr-xr-x | lib/async.js | 6 | ||||
-rwxr-xr-x | test/test-async.js | 25 |
2 files changed, 29 insertions, 2 deletions
diff --git a/lib/async.js b/lib/async.js index 64398b9..42b2621 100755 --- a/lib/async.js +++ b/lib/async.js @@ -402,7 +402,8 @@ async.auto = function (tasks, callback) { callback = callback || function () {}; var keys = _keys(tasks); - if (!keys.length) { + var remainingTasks = keys.length + if (!remainingTasks) { return callback(null); } @@ -421,13 +422,14 @@ } }; var taskComplete = function () { + remainingTasks-- _each(listeners.slice(0), function (fn) { fn(); }); }; addListener(function () { - if (_keys(results).length === keys.length) { + if (!remainingTasks) { var theCallback = callback; // prevent final callback from calling itself if it errors callback = function () {}; diff --git a/test/test-async.js b/test/test-async.js index f7eca6d..32a6cba 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -554,6 +554,31 @@ exports['auto calls callback multiple times'] = function(test) { }, 10); }; +// Issue 462 on github: https://github.com/caolan/async/issues/462 +exports['auto modifying results causes final callback to run early'] = function(test) { + async.auto({ + task1: function(callback, results){ + results.inserted = true + callback(null, 'task1'); + }, + task2: function(callback){ + setTimeout(function(){ + callback(null, 'task2'); + }, 50); + }, + task3: function(callback){ + setTimeout(function(){ + callback(null, 'task3'); + }, 100); + } + }, + function(err, results){ + test.equal(results.inserted, true) + test.ok(results.task3, 'task3') + test.done(); + }); +}; + exports['waterfall'] = function(test){ test.expect(6); var call_order = []; |