summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraeme Yeates <yeatesgraeme@gmail.com>2015-08-29 15:29:34 -0400
committerGraeme Yeates <yeatesgraeme@gmail.com>2015-08-29 15:30:53 -0400
commit62e87045af76b334b135e80fdd7a21a8b2f25a72 (patch)
tree0a3880d7989d00bf0992e7fe72bb0bd1a3484991
parentb2fded336afaef589eddb602b29a228faffcb21e (diff)
downloadasync-iters.tar.gz
Implement eachOf through _keyIteratoriters
-rw-r--r--lib/async.js33
-rwxr-xr-xtest/test-async.js13
2 files changed, 28 insertions, 18 deletions
diff --git a/lib/async.js b/lib/async.js
index 1f1e0ef..a7743f5 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 18894b0..8d68ae4 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){