summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/async.js195
1 files changed, 76 insertions, 119 deletions
diff --git a/lib/async.js b/lib/async.js
index ac31b89..f176085 100644
--- a/lib/async.js
+++ b/lib/async.js
@@ -561,7 +561,7 @@
async.setImmediate(taskComplete);
}
});
- var requires = task.slice(0, Math.abs(task.length - 1)) || [];
+ var requires = task.slice(0, Math.abs(task.length - 1));
// prevent dead-locks
var len = requires.length;
var dep;
@@ -595,7 +595,7 @@
- async.retry = function(/*[times,] task [, callback]*/) {
+ async.retry = function(times, task, callback) {
var DEFAULT_TIMES = 5;
var DEFAULT_INTERVAL = 0;
@@ -617,31 +617,18 @@
}
}
- switch(arguments.length){
- case 1: {
- opts.task = arguments[0];
- break;
- }
- case 2 : {
- if(typeof arguments[0] === 'number' || typeof arguments[0] === 'object'){
- parseTimes(opts, arguments[0]);
- opts.task = arguments[1];
- } else {
- opts.task = arguments[0];
- opts.callback = arguments[1];
- }
- break;
- }
- case 3: {
- parseTimes(opts, arguments[0]);
- opts.task = arguments[1];
- opts.callback = arguments[2];
- break;
- }
- default: {
- throw new Error('Invalid arguments - must be either (task), (task, callback), (times, task) or (times, task, callback)');
- }
- }
+ var length = arguments.length;
+ if (length < 1 || length > 3) {
+ throw new Error('Invalid arguments - must be either (task), (task, callback), (times, task) or (times, task, callback)');
+ } else if (length <= 2 && typeof times === 'function') {
+ callback = task;
+ task = times;
+ }
+ if (typeof times !== 'function') {
+ parseTimes(opts, times);
+ }
+ opts.callback = callback;
+ opts.task = task;
function wrappedTask(wrappedCallback, wrappedResults) {
function retryAttempt(task, finalAttempt) {
@@ -778,102 +765,74 @@
async.whilst = function (test, iterator, callback) {
callback = callback || noop;
if (test()) {
- iterator(function (err) {
+ var next = _restParam(function(err, args) {
if (err) {
- return callback(err);
+ callback(err);
+ } else if (test.apply(this, args)) {
+ iterator(next);
+ } else {
+ callback(null);
}
- async.whilst(test, iterator, callback);
});
- }
- else {
+ iterator(next);
+ } else {
callback(null);
}
};
async.doWhilst = function (iterator, test, callback) {
- callback = callback || noop;
- iterator(_restParam(function (err, args) {
- if (err) {
- return callback(err);
- }
- if (test.apply(null, args)) {
- async.doWhilst(iterator, test, callback);
- }
- else {
- callback(null);
- }
- }));
+ var calls = 0;
+ return async.whilst(function() {
+ return ++calls <= 1 || test.apply(this, arguments);
+ }, iterator, callback);
};
async.until = function (test, iterator, callback) {
- callback = callback || noop;
- if (!test()) {
- iterator(function (err) {
- if (err) {
- return callback(err);
- }
- async.until(test, iterator, callback);
- });
- }
- else {
- callback(null);
- }
+ return async.whilst(function() {
+ return !test.apply(this, arguments);
+ }, iterator, callback);
};
async.doUntil = function (iterator, test, callback) {
- callback = callback || noop;
- iterator(_restParam(function (err, args) {
- if (err) {
- return callback(err);
- }
- if (!test.apply(null, args)) {
- async.doUntil(iterator, test, callback);
- }
- else {
- callback(null);
- }
- }));
+ return async.doWhilst(iterator, function() {
+ return !test.apply(this, arguments);
+ }, callback);
};
async.during = function (test, iterator, callback) {
callback = callback || noop;
- test(function(err, truth) {
+
+ var next = _restParam(function(err, args) {
if (err) {
- return callback(err);
- }
- if (truth) {
- iterator(function (err) {
- if (err) {
- return callback(err);
- }
- async.during(test, iterator, callback);
- });
+ callback(err);
+ } else {
+ args.push(check);
+ test.apply(this, args);
}
- else {
+ });
+
+ var check = function(err, truth) {
+ if (err) {
+ callback(err);
+ } else if (truth) {
+ iterator(next);
+ } else {
callback(null);
}
- });
+ };
+
+ test(check);
};
async.doDuring = function (iterator, test, callback) {
- callback = callback || noop;
- iterator(_restParam(function (err, args) {
- if (err) {
- return callback(err);
+ var calls = 0;
+ async.during(function(next) {
+ if (calls++ < 1) {
+ next(null, true);
+ } else {
+ test.apply(this, arguments);
}
- args.push(function (err, truth) {
- if (err) {
- return callback(err);
- }
- if (truth) {
- async.doDuring(iterator, test, callback);
- }
- else {
- callback(null);
- }
- });
- test.apply(null, args);
- }));
+ }, iterator, callback);
};
function _queue(worker, concurrency, payload) {
@@ -1152,7 +1111,7 @@
return _restParam(function (args) {
var that = this;
- var callback = args.slice(-1)[0];
+ var callback = args[args.length - 1];
if (typeof callback == 'function') {
args.pop();
} else {
@@ -1175,29 +1134,27 @@
};
- var _applyEach = _restParam(function _applyEach(eachfn, fns, args) {
- var go = _restParam(function(args) {
- var that = this;
- var callback = args.pop();
- return eachfn(fns, function (fn, _, cb) {
- fn.apply(that, args.concat([cb]));
- },
- callback);
+ function _applyEach(eachfn) {
+ return _restParam(function(fns, args) {
+ var go = _restParam(function(args) {
+ var that = this;
+ var callback = args.pop();
+ return eachfn(fns, function (fn, _, cb) {
+ fn.apply(that, args.concat([cb]));
+ },
+ callback);
+ });
+ if (args.length) {
+ return go.apply(this, args);
+ }
+ else {
+ return go;
+ }
});
- if (args.length) {
- return go.apply(this, args);
- }
- else {
- return go;
- }
- });
+ }
- async.applyEach = _restParam(function (args) {
- return _applyEach.apply(null, [async.eachOf].concat(args));
- });
- async.applyEachSeries = _restParam(function (args) {
- return _applyEach.apply(null, [async.eachOfSeries].concat(args));
- });
+ async.applyEach = _applyEach(async.eachOf);
+ async.applyEachSeries = _applyEach(async.eachOfSeries);
async.forever = function (fn, callback) {