diff options
-rw-r--r-- | lib/async.js | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/lib/async.js b/lib/async.js index 7aa32b9..30c5c83 100644 --- a/lib/async.js +++ b/lib/async.js @@ -39,20 +39,18 @@ }; function only_once(fn) { - var called = false; return function() { - if (called) throw new Error("Callback was already called."); - called = true; + if (fn === null) throw new Error("Callback was already called."); fn.apply(this, arguments); + fn = null; }; } function _once(fn) { - var called = false; return function() { - if (called) return; - called = true; + if (fn === null) return; fn.apply(this, arguments); + fn = null; }; } @@ -116,6 +114,13 @@ }); } + function _indexOf(arr, item) { + for (var i = 0; i < arr.length; i++) { + if (arr[i] === item) return i; + } + return -1; + } + var _keys = Object.keys || function (obj) { var keys = []; for (var k in obj) { @@ -521,12 +526,8 @@ listeners.unshift(fn); } function removeListener(fn) { - for (var i = 0; i < listeners.length; i += 1) { - if (listeners[i] === fn) { - listeners.splice(i, 1); - return; - } - } + var idx = _indexOf(listeners, fn); + if (idx >= 0) listeners.splice(idx, 1); } function taskComplete() { remainingTasks--; @@ -549,8 +550,8 @@ } if (err) { var safeResults = {}; - _arrayEach(_keys(results), function(rkey) { - safeResults[rkey] = results[rkey]; + _forEachOf(results, function(val, rkey) { + safeResults[rkey] = val; }); safeResults[k] = args; callback(err, safeResults); @@ -560,7 +561,7 @@ async.setImmediate(taskComplete); } }); - var requires = task.slice(0, Math.abs(task.length - 1)); + var requires = task.slice(0, task.length - 1); // prevent dead-locks var len = requires.length; var dep; @@ -568,7 +569,7 @@ if (!(dep = tasks[requires[len]])) { throw new Error('Has inexistant dependency'); } - if (_isArray(dep) && !!~dep.indexOf(k)) { + if (_isArray(dep) && _indexOf(dep, k) >= 0) { throw new Error('Has cyclic dependencies'); } } |