diff options
author | Alexander Early <aearly@fluid.com> | 2015-05-30 19:18:04 -0700 |
---|---|---|
committer | Alexander Early <aearly@fluid.com> | 2015-05-30 19:18:04 -0700 |
commit | 8d55ac686f9681e502f25b94b84c37359af3b746 (patch) | |
tree | 92713da5cfba4fca18f0cd82191c0b01979962dd | |
parent | 13e1d81fc059d8e491397d01c2852b1f23950398 (diff) | |
download | async-8d55ac686f9681e502f25b94b84c37359af3b746.tar.gz |
factored _each into _arrayEach and _forEachOf depending on collection type
-rw-r--r-- | lib/async.js | 76 |
1 files changed, 46 insertions, 30 deletions
diff --git a/lib/async.js b/lib/async.js index e44f29c..f863530 100644 --- a/lib/async.js +++ b/lib/async.js @@ -49,7 +49,22 @@ return _toString.call(obj) === '[object Array]'; }; - function _each(arr, iterator) { + function _isArrayLike(arr) { + return _isArray(arr) || ( + // has a positive integer length property + typeof arr.length === "number" && + arr.length >= 0 && + arr.length % 1 === 0 + ); + } + + function _each(coll, iterator) { + return _isArrayLike(coll) ? + _arrayEach(coll, iterator) : + _forEachOf(coll, iterator); + } + + function _arrayEach(arr, iterator) { var index = -1, length = arr.length; @@ -70,14 +85,14 @@ } function _reduce(arr, iterator, memo) { - _each(arr, function (x, i, a) { + _arrayEach(arr, function (x, i, a) { memo = iterator(memo, x, i, a); }); return memo; } function _forEachOf(object, iterator) { - _each(_keys(object), function (key) { + _arrayEach(_keys(object), function (key) { iterator(object[key], key); }); } @@ -154,7 +169,7 @@ return callback(null); } var completed = 0; - _each(arr, function (x) { + _arrayEach(arr, function (x) { iterator(x, only_once(done) ); }); function done(err) { @@ -201,8 +216,7 @@ async.forEachLimit = async.eachLimit = function (arr, limit, iterator, callback) { - var fn = _eachLimit(limit); - fn.apply(null, [arr, iterator, callback]); + var fn = _eachLimit(limit)(arr, iterator, callback); }; function _eachLimit(limit) { @@ -251,30 +265,32 @@ async.forEachOf = async.eachOf = function (object, iterator, callback) { - callback = callback || function () {}; + callback = callback || noop; var size = object.length || _keys(object).length; var completed = 0; if (!size) { return callback(null); } _forEachOf(object, function (value, key) { - iterator(object[key], key, function (err) { - if (err) { - callback(err); - callback = function () {}; - } else { - completed += 1; - if (completed === size) { - callback(null); - } - } - }); + iterator(object[key], key, only_once(done)); }); + function done(err) { + if (err) { + callback(err); + callback = noop; + } + else { + completed += 1; + if (completed >= size) { + callback(null); + } + } + } }; async.forEachOfSeries = async.eachOfSeries = function (obj, iterator, callback) { - callback = callback || function () {}; + callback = callback || noop; var keys = _keys(obj); var size = keys.length; if (!size) { @@ -287,7 +303,7 @@ iterator(obj[key], key, function (err) { if (err) { callback(err); - callback = function () {}; + callback = noop; } else { completed += 1; @@ -319,7 +335,7 @@ function _eachOfLimit(limit) { return function (obj, iterator, callback) { - callback = callback || function () {}; + callback = callback || noop; var keys = _keys(obj); var size = keys.length; if (!size || limit <= 0) { @@ -343,7 +359,7 @@ if (err) { callback(err); errored = true; - callback = function () {}; + callback = noop; } else { completed += 1; @@ -593,7 +609,7 @@ } function taskComplete() { remainingTasks--; - _each(listeners.slice(0), function (fn) { + _arrayEach(listeners.slice(0), function (fn) { fn(); }); } @@ -608,7 +624,7 @@ } }); - _each(keys, function (k) { + _arrayEach(keys, function (k) { var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]]; function taskCallback(err) { var args = _baseSlice(arguments, 1); @@ -617,7 +633,7 @@ } if (err) { var safeResults = {}; - _each(_keys(results), function(rkey) { + _arrayEach(_keys(results), function(rkey) { safeResults[rkey] = results[rkey]; }); safeResults[k] = args; @@ -920,7 +936,7 @@ } }); } - _each(data, function(task) { + _arrayEach(data, function(task) { var item = { data: task, callback: typeof callback === 'function' ? callback : null @@ -1042,7 +1058,7 @@ } }); } - _each(data, function(task) { + _arrayEach(data, function(task) { var item = { data: task, priority: priority, @@ -1087,7 +1103,7 @@ if (!_isArray(data)) { data = [data]; } - _each(data, function(task) { + _arrayEach(data, function(task) { tasks.push({ data: task, callback: typeof callback === 'function' ? callback : null @@ -1121,7 +1137,7 @@ working = false; var args = arguments; - _each(ts, function (data) { + _arrayEach(ts, function (data) { if (data.callback) { data.callback.apply(null, args); } @@ -1152,7 +1168,7 @@ } } else if (console[name]) { - _each(args, function (x) { + _arrayEach(args, function (x) { console[name](x); }); } |