summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGraeme Yeates <yeatesgraeme@gmail.com>2015-08-31 17:02:05 -0400
committerGraeme Yeates <yeatesgraeme@gmail.com>2015-08-31 17:02:05 -0400
commit108c49710af2d296b98127c31fb0001d8c6693fa (patch)
treea859521a66958fe13f171849746479e3cebf3b90
parent8eafbcd3e02b36cff0e14d14fcbe71df6c0c9e31 (diff)
downloadasync-es6-iterators.tar.gz
Add support for ES2015 iteratorses6-iterators
-rw-r--r--.jshintrc1
-rw-r--r--lib/async.js51
2 files changed, 33 insertions, 19 deletions
diff --git a/.jshintrc b/.jshintrc
index 76be34a..72e53aa 100644
--- a/.jshintrc
+++ b/.jshintrc
@@ -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);