diff options
Diffstat (limited to 'lib/async.js')
-rw-r--r-- | lib/async.js | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/lib/async.js b/lib/async.js index bbbd05c..09f947f 100644 --- a/lib/async.js +++ b/lib/async.js @@ -12,6 +12,15 @@ return async; }; + function only_once(fn) { + var called = false; + return function() { + if (called) throw new Error("Callback was already called."); + called = true; + fn.apply(root, arguments); + } + } + //// cross-browser compatiblity functions //// var _forEach = function (arr, iterator) { @@ -76,7 +85,7 @@ } var completed = 0; _forEach(arr, function (x) { - iterator(x, function (err) { + iterator(x, only_once(function (err) { if (err) { callback(err); callback = function () {}; @@ -87,7 +96,7 @@ callback(null); } } - }); + })); }); }; @@ -598,14 +607,14 @@ var task = q.tasks.shift(); if(q.empty && q.tasks.length == 0) q.empty(); workers += 1; - worker(task.data, function () { + worker(task.data, only_once(function() { workers -= 1; if (task.callback) { task.callback.apply(task, arguments); } if(q.drain && q.tasks.length + workers == 0) q.drain(); q.process(); - }); + })); } }, length: function () { |