diff options
-rw-r--r-- | lib/async.js | 195 |
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) { |