diff options
author | Graeme Yeates <yeatesgraeme@gmail.com> | 2015-08-31 17:02:05 -0400 |
---|---|---|
committer | Graeme Yeates <yeatesgraeme@gmail.com> | 2015-08-31 17:02:05 -0400 |
commit | 108c49710af2d296b98127c31fb0001d8c6693fa (patch) | |
tree | a859521a66958fe13f171849746479e3cebf3b90 | |
parent | 8eafbcd3e02b36cff0e14d14fcbe71df6c0c9e31 (diff) | |
download | async-es6-iterators.tar.gz |
Add support for ES2015 iteratorses6-iterators
-rw-r--r-- | .jshintrc | 1 | ||||
-rw-r--r-- | lib/async.js | 51 |
2 files changed, 33 insertions, 19 deletions
@@ -19,6 +19,7 @@ "sub": true, "browser": true, "node": true, + "esnext": true, "globals": { "self": true, "define": true, diff --git a/lib/async.js b/lib/async.js index a7743f5..b2c86ad 100644 --- a/lib/async.js +++ b/lib/async.js @@ -19,6 +19,7 @@ return !v; } + // global on the server, window in the browser var previous_async; @@ -33,6 +34,8 @@ previous_async = root.async; } + var iteratorSymbol = typeof Symbol == 'function' && Symbol.iterator; + async.noConflict = function () { root.async = previous_async; return async; @@ -131,22 +134,32 @@ return keys; }; - function _keyIterator(coll) { + function _iterator(coll) { var i = -1; var len; var keys; + if (_isArrayLike(coll)) { len = coll.length; return function next() { i++; - return i < len ? i : null; + return i < len ? [coll[i], i] : null; }; - } else { + } + else if (iteratorSymbol && coll[iteratorSymbol]) { + var iterator = coll[iteratorSymbol](); + return function next() { + var item = iterator.next(); + if (item.done) return null; + return _isArray(item.value) ? item.value : [item.value]; + }; + } + else { keys = _keys(coll); len = keys.length; return function next() { i++; - return i < len ? keys[i] : null; + return i < len ? [coll[keys[i]], keys[i]] : null; }; } } @@ -225,12 +238,12 @@ callback = _once(callback || noop); object = object || []; - var iter = _keyIterator(object); - var key, completed = 0; + var iter = _iterator(object); + var item, completed = 0; - while ((key = iter()) != null) { + while ((item = iter()) != null) { completed += 1; - iterator(object[key], key, only_once(done)); + iterator(item[0], item[1], only_once(done)); } if (completed === 0) callback(null); @@ -242,7 +255,7 @@ } // Check key is null in case iterator isn't exhausted // and done resolved synchronously. - else if (key === null && completed <= 0) { + else if (item === null && completed <= 0) { callback(null); } } @@ -252,20 +265,20 @@ async.eachOfSeries = function (obj, iterator, callback) { callback = _once(callback || noop); obj = obj || []; - var nextKey = _keyIterator(obj); - var key = nextKey(); + var iter = _iterator(obj); + var item = iter(); function iterate() { var sync = true; - if (key === null) { + if (item === null) { return callback(null); } - iterator(obj[key], key, only_once(function (err) { + iterator(item[0], item[1], only_once(function (err) { if (err) { callback(err); } else { - key = nextKey(); - if (key === null) { + item = iter(); + if (item === null) { return callback(null); } else { if (sync) { @@ -293,7 +306,7 @@ return function (obj, iterator, callback) { callback = _once(callback || noop); obj = obj || []; - var nextKey = _keyIterator(obj); + var iter = _iterator(obj); if (limit <= 0) { return callback(null); } @@ -307,8 +320,8 @@ } while (running < limit && !errored) { - var key = nextKey(); - if (key === null) { + var item = iter(); + if (item === null) { done = true; if (running <= 0) { callback(null); @@ -316,7 +329,7 @@ return; } running += 1; - iterator(obj[key], key, only_once(function (err) { + iterator(item[0], item[1], only_once(function (err) { running -= 1; if (err) { callback(err); |