summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolan McMahon <caolan.mcmahon@gmail.com>2014-03-30 12:41:44 +0100
committerCaolan McMahon <caolan.mcmahon@gmail.com>2014-03-30 12:41:44 +0100
commit9dab0ca39a12e5f10630a6949bd1552bc2733d57 (patch)
treeb8d063302b3041511aefe39aac34c4967161be78
parent28697107d8821a8f3501143a87c9a341e3e9140a (diff)
parentf1f9bfe9950b126da81ee3fe6bd16d891138ab87 (diff)
downloadasync-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-xlib/async.js6
-rwxr-xr-xtest/test-async.js25
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 = [];