diff options
author | Alexander Early <alexander.early@gmail.com> | 2015-10-24 21:47:17 -0700 |
---|---|---|
committer | Alexander Early <alexander.early@gmail.com> | 2015-10-24 21:47:17 -0700 |
commit | 56bdb50912df8de4b1aba09c357c808965cd1b96 (patch) | |
tree | 72f251a014054d6d70be601fb7646ebf28373444 | |
parent | ea357efeaece775240bab6419917bb6115a91568 (diff) | |
parent | 62e87045af76b334b135e80fdd7a21a8b2f25a72 (diff) | |
download | async-56bdb50912df8de4b1aba09c357c808965cd1b96.tar.gz |
Merge pull request #896 from caolan/iters
Implement eachOf through _keyIterator
-rw-r--r-- | lib/async.js | 33 | ||||
-rwxr-xr-x | test/test-async.js | 13 |
2 files changed, 28 insertions, 18 deletions
diff --git a/lib/async.js b/lib/async.js index 337e87e..6b14514 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; @@ -230,23 +224,26 @@ 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 iter = _keyIterator(object); + var key, completed = 0; + + while ((key = iter()) != null) { + completed += 1; iterator(object[key], key, only_once(done)); - }); + } + + if (completed === 0) callback(null); + function done(err) { + completed--; if (err) { callback(err); } - else { - completed += 1; - if (completed >= size) { - callback(null); - } + // Check key is null in case iterator isn't exhausted + // and done resolved synchronously. + else if (key === null && completed <= 0) { + callback(null); } } }; diff --git a/test/test-async.js b/test/test-async.js index 53fac29..e98eaf4 100755 --- a/test/test-async.js +++ b/test/test-async.js @@ -1347,6 +1347,19 @@ exports['forEachOf'] = function(test){ }); }; +exports['forEachOf - instant resolver'] = function(test){ + test.expect(1); + var args = []; + async.forEachOf({ a: 1, b: 2 }, function(x, k, cb) { + args.push(k, x); + cb(); + }, function(){ + // ensures done callback isn't called before all items iterated + test.same(args, ["a", 1, "b", 2]); + test.done(); + }); +}; + exports['forEachOf empty object'] = function(test){ test.expect(1); async.forEachOf({}, function(value, key, callback){ |