diff options
Diffstat (limited to 'lib/async.js')
-rw-r--r-- | lib/async.js | 30 |
1 files changed, 11 insertions, 19 deletions
diff --git a/lib/async.js b/lib/async.js index 208e602..b8a2b24 100644 --- a/lib/async.js +++ b/lib/async.js @@ -77,12 +77,6 @@ ); } - function _each(coll, iterator) { - return _isArrayLike(coll) ? - _arrayEach(coll, iterator) : - _forEachOf(coll, iterator); - } - function _arrayEach(arr, iterator) { var index = -1, length = arr.length; @@ -229,24 +223,22 @@ async.forEachOf = async.eachOf = function (object, iterator, callback) { callback = _once(callback || noop); - object = object || []; - var size = _isArrayLike(object) ? object.length : _keys(object).length; - var completed = 0; - if (!size) { - return callback(null); - } - _each(object, function (value, key) { + + var nextKey = _keyIterator(object || []); + var key, running = 0; + while ((key = nextKey()) != null) { + running += 1; iterator(object[key], key, only_once(done)); - }); + } + if (!running) { + callback (null); + } function done(err) { if (err) { callback(err); } - else { - completed += 1; - if (completed >= size) { - callback(null); - } + else if (--running <= 0) { + callback(null); } } }; |