summaryrefslogtreecommitdiff
path: root/lib/async.js
diff options
context:
space:
mode:
Diffstat (limited to 'lib/async.js')
-rw-r--r--lib/async.js17
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 () {