summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Early <aearly@fluid.com>2015-05-30 19:18:04 -0700
committerAlexander Early <aearly@fluid.com>2015-05-30 19:18:04 -0700
commit8d55ac686f9681e502f25b94b84c37359af3b746 (patch)
tree92713da5cfba4fca18f0cd82191c0b01979962dd
parent13e1d81fc059d8e491397d01c2852b1f23950398 (diff)
downloadasync-8d55ac686f9681e502f25b94b84c37359af3b746.tar.gz
factored _each into _arrayEach and _forEachOf depending on collection type
-rw-r--r--lib/async.js76
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);
});
}