summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.travis.yml1
-rw-r--r--CHANGELOG.md13
-rw-r--r--Makefile14
-rw-r--r--README.md48
-rw-r--r--bower.json7
-rw-r--r--component.json2
-rw-r--r--dist/async.js1216
-rw-r--r--dist/async.min.js3
-rw-r--r--dist/async.min.map1
-rw-r--r--lib/async.js17
-rw-r--r--package.json2
-rwxr-xr-xtest/test-async.js87
12 files changed, 1364 insertions, 47 deletions
diff --git a/.travis.yml b/.travis.yml
index 5a72e0d..e225b8f 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -3,6 +3,7 @@ node_js:
- "0.10"
- "0.12"
- "iojs-v2.1.0"
+sudo: false
after_success: npm run coveralls
# Needed to run Karma with Firefox on Travis
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 941d1b0..cd5f902 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,15 @@
+# v1.4.0
+
+- `asyncify` now supports promises (#840)
+- Added `Limit` versions of `filter` and `reject` (#836)
+- Add `Limit` versions of `detect`, `some` and `every` (#828, #829)
+- `some`, `every` and `detect` now short circuit early (#828, #829)
+- Improve detection of the global object (#804), enabling use in WebWorkers
+- `whilst` now called with arguments from iterator (#823)
+- `during` now gets called with arguments from iterator (#824)
+- Code simplifications and optimizations aplenty ([diff](https://github.com/caolan/async/compare/v1.3.0...v1.4.0))
+
+
# v1.3.0
New Features:
@@ -13,6 +25,7 @@ New Features:
Bug Fixes:
- `cargo` now exposes the `payload` size, and `cargo.payload` can be changed on the fly after the `cargo` is created. (#740, #744, #783)
+
# v1.2.1
Bug Fix:
diff --git a/Makefile b/Makefile
index 35f4c38..6609aa6 100644
--- a/Makefile
+++ b/Makefile
@@ -6,13 +6,15 @@ JSHINT = "$(CWD)/node_modules/.bin/jshint"
JSCS = "$(CWD)/node_modules/.bin/jscs"
XYZ = node_modules/.bin/xyz --repo git@github.com:caolan/async.git
-BUILDDIR = lib
+BUILDDIR = dist
+SRC = lib/async.js
-all: clean test build
+all: lint test clean build
build: $(wildcard lib/*.js)
mkdir -p $(BUILDDIR)
- $(UGLIFY) lib/async.js -mc > $(BUILDDIR)/async.min.js
+ cp $(SRC) $(BUILDDIR)/async.js
+ cd $(BUILDDIR) && $(UGLIFY) async.js -mc --source-map async.min.map -o async.min.js
test:
$(NODEUNIT) test
@@ -21,8 +23,8 @@ clean:
rm -rf $(BUILDDIR)
lint:
- $(JSHINT) lib/*.js test/*.js perf/*.js
- $(JSCS) lib/*.js test/*.js perf/*.js
+ $(JSHINT) $(SRC) test/*.js perf/*.js
+ $(JSCS) $(SRC) test/*.js perf/*.js
.PHONY: test lint build all clean
@@ -31,5 +33,5 @@ lint:
release-major release-minor release-patch: all
./support/sync-package-managers.js
git add --force $(BUILDDIR)
- git ci -am "update minified build"
+ git commit -am "update minified build"
@$(XYZ) --increment $(@:release-%=%)
diff --git a/README.md b/README.md
index 4ad483d..c0a93c1 100644
--- a/README.md
+++ b/README.md
@@ -52,9 +52,7 @@ There are many more functions available so take a look at the docs below for a
full list. This module aims to be comprehensive, so if you feel anything is
missing please create a GitHub issue for it.
-## Common Pitfalls
-
-<a name="stack-overflow">
+## Common Pitfalls <sub>[(StackOverflow)](http://stackoverflow.com/questions/tagged/async.js)</sub>
### Synchronous iteration functions
If you get an error like `RangeError: Maximum call stack size exceeded.` or other stack overflow issues when using async, you are likely using a synchronous iterator. By *synchronous* we mean a function that calls its callback on the same tick in the javascript event loop, without doing any I/O or using any timers. Calling many callbacks iteratively will quickly overflow the stack. If you run into this issue, just defer your callback with `async.nextTick` to start a new call stack on the next tick of the event loop.
@@ -103,7 +101,7 @@ async.waterfall([
callback(new Error("failed getting something:" + err.message));
// we should return here
}
- // since we did not return, this callback still will be called and
+ // since we did not return, this callback still will be called and
// `processData` will be called twice
callback(result);
});
@@ -191,16 +189,14 @@ Some functions are also available in the following forms:
* [`each`](#each), `eachSeries`, `eachLimit`
* [`forEachOf`](#forEachOf), `forEachOfSeries`, `forEachOfLimit`
* [`map`](#map), `mapSeries`, `mapLimit`
-* [`filter`](#filter), `filterSeries`
-* [`reject`](#reject), `rejectSeries`
+* [`filter`](#filter), `filterSeries`, `filterLimit`
+* [`reject`](#reject), `rejectSeries`, `rejectLimit`
* [`reduce`](#reduce), [`reduceRight`](#reduceRight)
-* [`detect`](#detect), `detectSeries`
+* [`detect`](#detect), `detectSeries`, `detectLimit`
* [`sortBy`](#sortBy)
-* [`some`](#some)
-* [`someLimit`](#someLimit)
-* [`every`](#every)
-* [`concat`](#concat)
-* [`concatSeries`](#concatSeries)
+* [`some`](#some), `someLimit`
+* [`every`](#every), `everyLimit`
+* [`concat`](#concat), `concatSeries`
### Control Flow
@@ -424,6 +420,7 @@ async.filter(['file1','file2','file3'], fs.exists, function(results){
__Related__
* filterSeries(arr, iterator, [callback])
+* filterLimit(arr, limit, iterator, [callback])
---------------------------------------
@@ -435,6 +432,7 @@ The opposite of [`filter`](#filter). Removes values that pass an `async` truth t
__Related__
* rejectSeries(arr, iterator, [callback])
+* rejectLimit(arr, limit, iterator, [callback])
---------------------------------------
@@ -522,6 +520,7 @@ async.detect(['file1','file2','file3'], fs.exists, function(result){
__Related__
* detectSeries(arr, iterator, [callback])
+* detectLimit(arr, limit, iterator, [callback])
---------------------------------------
@@ -606,26 +605,9 @@ async.some(['file1','file2','file3'], fs.exists, function(result){
});
```
----------------------------------------
-
-<a name="someLimit" />
-### someLimit(arr, limit, iterator, callback)
-
-__Alias:__ `anyLimit`
-
-The same as [`some`](#some), only no more than `limit` `iterator`s will be simultaneously
-running at any time.
-
-__Arguments__
+__Related__
-* `arr` - An array to iterate over.
-* `limit` - The maximum number of `iterator`s to run at any time.
-* `iterator(item, callback)` - A truth test to apply to each item in the array
- in parallel. The iterator is passed a callback(truthValue) which must be
- called with a boolean argument once it has completed.
-* `callback(result)` - A callback which is called as soon as any iterator returns
- `true`, or after all the iterator functions have finished. Result will be
- either `true` or `false` depending on the values of the async tests.
+* someLimit(arr, limit, iterator, callback)
---------------------------------------
@@ -659,6 +641,10 @@ async.every(['file1','file2','file3'], fs.exists, function(result){
});
```
+__Related__
+
+* everyLimit(arr, limit, iterator, callback)
+
---------------------------------------
<a name="concat" />
diff --git a/bower.json b/bower.json
index f31127a..13558f1 100644
--- a/bower.json
+++ b/bower.json
@@ -15,12 +15,17 @@
},
"devDependencies": {
"benchmark": "bestiejs/benchmark.js",
+ "bluebird": "^2.9.32",
"coveralls": "^2.11.2",
+ "es6-promise": "^2.3.0",
+ "jscs": "^1.13.1",
"jshint": "~2.8.0",
"lodash": "^3.9.0",
"mkdirp": "~0.5.1",
+ "native-promise-only": "^0.8.0-a",
"nodeunit": ">0.0.0",
"nyc": "^2.1.0",
+ "rsvp": "^3.0.18",
"uglify-js": "~2.4.0",
"xyz": "^0.5.0",
"yargs": "~3.9.1"
@@ -40,5 +45,5 @@
"authors": [
"Caolan McMahon"
],
- "version": "1.3.0"
+ "version": "1.4.0"
}
diff --git a/component.json b/component.json
index e7816eb..3b1c52d 100644
--- a/component.json
+++ b/component.json
@@ -1,7 +1,7 @@
{
"name": "async",
"description": "Higher-order functions and common patterns for asynchronous code",
- "version": "1.3.0",
+ "version": "1.4.0",
"keywords": [
"async",
"callback",
diff --git a/dist/async.js b/dist/async.js
new file mode 100644
index 0000000..f3cfb80
--- /dev/null
+++ b/dist/async.js
@@ -0,0 +1,1216 @@
+/*!
+ * async
+ * https://github.com/caolan/async
+ *
+ * Copyright 2010-2014 Caolan McMahon
+ * Released under the MIT license
+ */
+(function () {
+
+ var async = {};
+ function noop() {}
+ function identity(v) {
+ return v;
+ }
+ function toBool(v) {
+ return !!v;
+ }
+ function notId(v) {
+ return !v;
+ }
+
+ // global on the server, window in the browser
+ var previous_async;
+
+ // Establish the root object, `window` (`self`) in the browser, `global`
+ // on the server, or `this` in some virtual machines. We use `self`
+ // instead of `window` for `WebWorker` support.
+ var root = typeof self === 'object' && self.self === self && self ||
+ typeof global === 'object' && global.global === global && global ||
+ this;
+
+ if (root != null) {
+ previous_async = root.async;
+ }
+
+ async.noConflict = function () {
+ root.async = previous_async;
+ return async;
+ };
+
+ function only_once(fn) {
+ return function() {
+ if (fn === null) throw new Error("Callback was already called.");
+ fn.apply(this, arguments);
+ fn = null;
+ };
+ }
+
+ function _once(fn) {
+ return function() {
+ if (fn === null) return;
+ fn.apply(this, arguments);
+ fn = null;
+ };
+ }
+
+ //// cross-browser compatiblity functions ////
+
+ var _toString = Object.prototype.toString;
+
+ var _isArray = Array.isArray || function (obj) {
+ return _toString.call(obj) === '[object Array]';
+ };
+
+ 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;
+
+ while (++index < length) {
+ iterator(arr[index], index, arr);
+ }
+ }
+
+ function _map(arr, iterator) {
+ var index = -1,
+ length = arr.length,
+ result = Array(length);
+
+ while (++index < length) {
+ result[index] = iterator(arr[index], index, arr);
+ }
+ return result;
+ }
+
+ function _range(count) {
+ return _map(Array(count), function (v, i) { return i; });
+ }
+
+ function _reduce(arr, iterator, memo) {
+ _arrayEach(arr, function (x, i, a) {
+ memo = iterator(memo, x, i, a);
+ });
+ return memo;
+ }
+
+ function _forEachOf(object, iterator) {
+ _arrayEach(_keys(object), function (key) {
+ iterator(object[key], key);
+ });
+ }
+
+ function _indexOf(arr, item) {
+ for (var i = 0; i < arr.length; i++) {
+ if (arr[i] === item) return i;
+ }
+ return -1;
+ }
+
+ var _keys = Object.keys || function (obj) {
+ var keys = [];
+ for (var k in obj) {
+ if (obj.hasOwnProperty(k)) {
+ keys.push(k);
+ }
+ }
+ return keys;
+ };
+
+ function _keyIterator(coll) {
+ var i = -1;
+ var len;
+ var keys;
+ if (_isArrayLike(coll)) {
+ len = coll.length;
+ return function next() {
+ i++;
+ return i < len ? i : null;
+ };
+ } else {
+ keys = _keys(coll);
+ len = keys.length;
+ return function next() {
+ i++;
+ return i < len ? keys[i] : null;
+ };
+ }
+ }
+
+ // Similar to ES6's rest param (http://ariya.ofilabs.com/2013/03/es6-and-rest-parameter.html)
+ // This accumulates the arguments passed into an array, after a given index.
+ // From underscore.js (https://github.com/jashkenas/underscore/pull/2140).
+ function _restParam(func, startIndex) {
+ startIndex = startIndex == null ? func.length - 1 : +startIndex;
+ return function() {
+ var length = Math.max(arguments.length - startIndex, 0);
+ var rest = Array(length);
+ for (var index = 0; index < length; index++) {
+ rest[index] = arguments[index + startIndex];
+ }
+ switch (startIndex) {
+ case 0: return func.call(this, rest);
+ case 1: return func.call(this, arguments[0], rest);
+ case 2: return func.call(this, arguments[0], arguments[1], rest);
+ }
+ // Currently unused but handle cases outside of the switch statement:
+ // var args = Array(startIndex + 1);
+ // for (index = 0; index < startIndex; index++) {
+ // args[index] = arguments[index];
+ // }
+ // args[startIndex] = rest;
+ // return func.apply(this, args);
+ };
+ }
+
+ function _withoutIndex(iterator) {
+ return function (value, index, callback) {
+ return iterator(value, callback);
+ };
+ }
+
+ //// exported async module functions ////
+
+ //// nextTick implementation with browser-compatible fallback ////
+
+ // capture the global reference to guard against fakeTimer mocks
+ var _setImmediate = typeof setImmediate === 'function' && setImmediate;
+
+ var _delay = _setImmediate ? function(fn) {
+ // not a direct alias for IE10 compatibility
+ _setImmediate(fn);
+ } : function(fn) {
+ setTimeout(fn, 0);
+ };
+
+ if (typeof process === 'object' && typeof process.nextTick === 'function') {
+ async.nextTick = process.nextTick;
+ } else {
+ async.nextTick = _delay;
+ }
+ async.setImmediate = _setImmediate ? _delay : async.nextTick;
+
+
+ async.forEach =
+ async.each = function (arr, iterator, callback) {
+ return async.eachOf(arr, _withoutIndex(iterator), callback);
+ };
+
+ async.forEachSeries =
+ async.eachSeries = function (arr, iterator, callback) {
+ return async.eachOfSeries(arr, _withoutIndex(iterator), callback);
+ };
+
+
+ async.forEachLimit =
+ async.eachLimit = function (arr, limit, iterator, callback) {
+ return _eachOfLimit(limit)(arr, _withoutIndex(iterator), callback);
+ };
+
+ async.forEachOf =
+ async.eachOf = function (object, iterator, callback) {
+ callback = _once(callback || noop);
+ object = object || [];
+ var size = _isArrayLike(object) ? object.length : _keys(object).length;
+ var completed = 0;
+ if (!size) {
+ return callback(null);
+ }
+ _each(object, function (value, key) {
+ iterator(object[key], key, only_once(done));
+ });
+ function done(err) {
+ if (err) {
+ callback(err);
+ }
+ else {
+ completed += 1;
+ if (completed >= size) {
+ callback(null);
+ }
+ }
+ }
+ };
+
+ async.forEachOfSeries =
+ async.eachOfSeries = function (obj, iterator, callback) {
+ callback = _once(callback || noop);
+ obj = obj || [];
+ var nextKey = _keyIterator(obj);
+ var key = nextKey();
+ function iterate() {
+ var sync = true;
+ if (key === null) {
+ return callback(null);
+ }
+ iterator(obj[key], key, only_once(function (err) {
+ if (err) {
+ callback(err);
+ }
+ else {
+ key = nextKey();
+ if (key === null) {
+ return callback(null);
+ } else {
+ if (sync) {
+ async.nextTick(iterate);
+ } else {
+ iterate();
+ }
+ }
+ }
+ }));
+ sync = false;
+ }
+ iterate();
+ };
+
+
+
+ async.forEachOfLimit =
+ async.eachOfLimit = function (obj, limit, iterator, callback) {
+ _eachOfLimit(limit)(obj, iterator, callback);
+ };
+
+ function _eachOfLimit(limit) {
+
+ return function (obj, iterator, callback) {
+ callback = _once(callback || noop);
+ obj = obj || [];
+ var nextKey = _keyIterator(obj);
+ if (limit <= 0) {
+ return callback(null);
+ }
+ var done = false;
+ var running = 0;
+ var errored = false;
+
+ (function replenish () {
+ if (done && running <= 0) {
+ return callback(null);
+ }
+
+ while (running < limit && !errored) {
+ var key = nextKey();
+ if (key === null) {
+ done = true;
+ if (running <= 0) {
+ callback(null);
+ }
+ return;
+ }
+ running += 1;
+ iterator(obj[key], key, only_once(function (err) {
+ running -= 1;
+ if (err) {
+ callback(err);
+ errored = true;
+ }
+ else {
+ replenish();
+ }
+ }));
+ }
+ })();
+ };
+ }
+
+
+ function doParallel(fn) {
+ return function (obj, iterator, callback) {
+ return fn(async.eachOf, obj, iterator, callback);
+ };
+ }
+ function doParallelLimit(fn) {
+ return function (obj, limit, iterator, callback) {
+ return fn(_eachOfLimit(limit), obj, iterator, callback);
+ };
+ }
+ function doSeries(fn) {
+ return function (obj, iterator, callback) {
+ return fn(async.eachOfSeries, obj, iterator, callback);
+ };
+ }
+
+ function _asyncMap(eachfn, arr, iterator, callback) {
+ callback = _once(callback || noop);
+ var results = [];
+ eachfn(arr, function (value, index, callback) {
+ iterator(value, function (err, v) {
+ results[index] = v;
+ callback(err);
+ });
+ }, function (err) {
+ callback(err, results);
+ });
+ }
+
+ async.map = doParallel(_asyncMap);
+ async.mapSeries = doSeries(_asyncMap);
+ async.mapLimit = doParallelLimit(_asyncMap);
+
+ // reduce only has a series version, as doing reduce in parallel won't
+ // work in many situations.
+ async.inject =
+ async.foldl =
+ async.reduce = function (arr, memo, iterator, callback) {
+ async.eachOfSeries(arr, function (x, i, callback) {
+ iterator(memo, x, function (err, v) {
+ memo = v;
+ callback(err);
+ });
+ }, function (err) {
+ callback(err || null, memo);
+ });
+ };
+
+ async.foldr =
+ async.reduceRight = function (arr, memo, iterator, callback) {
+ var reversed = _map(arr, identity).reverse();
+ async.reduce(reversed, memo, iterator, callback);
+ };
+
+ function _filter(eachfn, arr, iterator, callback) {
+ var results = [];
+ eachfn(arr, function (x, index, callback) {
+ iterator(x, function (v) {
+ if (v) {
+ results.push({index: index, value: x});
+ }
+ callback();
+ });
+ }, function () {
+ callback(_map(results.sort(function (a, b) {
+ return a.index - b.index;
+ }), function (x) {
+ return x.value;
+ }));
+ });
+ }
+
+ async.select =
+ async.filter = doParallel(_filter);
+
+ async.selectLimit =
+ async.filterLimit = doParallelLimit(_filter);
+
+ async.selectSeries =
+ async.filterSeries = doSeries(_filter);
+
+ function _reject(eachfn, arr, iterator, callback) {
+ _filter(eachfn, arr, function(value, cb) {
+ iterator(value, function(v) {
+ cb(!v);
+ });
+ }, callback);
+ }
+ async.reject = doParallel(_reject);
+ async.rejectLimit = doParallelLimit(_reject);
+ async.rejectSeries = doSeries(_reject);
+
+ function _createTester(eachfn, check, getResult) {
+ return function(arr, limit, iterator, cb) {
+ function done() {
+ if (cb) cb(getResult(false, void 0));
+ }
+ function iteratee(x, _, callback) {
+ if (!cb) return callback();
+ iterator(x, function (v) {
+ if (cb && check(v)) {
+ cb(getResult(true, x));
+ cb = iterator = false;
+ }
+ callback();
+ });
+ }
+ if (arguments.length > 3) {
+ eachfn(arr, limit, iteratee, done);
+ } else {
+ cb = iterator;
+ iterator = limit;
+ eachfn(arr, iteratee, done);
+ }
+ };
+ }
+
+ async.any =
+ async.some = _createTester(async.eachOf, toBool, identity);
+
+ async.someLimit = _createTester(async.eachOfLimit, toBool, identity);
+
+ async.all =
+ async.every = _createTester(async.eachOf, notId, notId);
+
+ async.everyLimit = _createTester(async.eachOfLimit, notId, notId);
+
+ function _findGetResult(v, x) {
+ return x;
+ }
+ async.detect = _createTester(async.eachOf, identity, _findGetResult);
+ async.detectSeries = _createTester(async.eachOfSeries, identity, _findGetResult);
+
+ async.sortBy = function (arr, iterator, callback) {
+ async.map(arr, function (x, callback) {
+ iterator(x, function (err, criteria) {
+ if (err) {
+ callback(err);
+ }
+ else {
+ callback(null, {value: x, criteria: criteria});
+ }
+ });
+ }, function (err, results) {
+ if (err) {
+ return callback(err);
+ }
+ else {
+ callback(null, _map(results.sort(comparator), function (x) {
+ return x.value;
+ }));
+ }
+
+ });
+
+ function comparator(left, right) {
+ var a = left.criteria, b = right.criteria;
+ return a < b ? -1 : a > b ? 1 : 0;
+ }
+ };
+
+ async.auto = function (tasks, callback) {
+ callback = _once(callback || noop);
+ var keys = _keys(tasks);
+ var remainingTasks = keys.length;
+ if (!remainingTasks) {
+ return callback(null);
+ }
+
+ var results = {};
+
+ var listeners = [];
+ function addListener(fn) {
+ listeners.unshift(fn);
+ }
+ function removeListener(fn) {
+ var idx = _indexOf(listeners, fn);
+ if (idx >= 0) listeners.splice(idx, 1);
+ }
+ function taskComplete() {
+ remainingTasks--;
+ _arrayEach(listeners.slice(0), function (fn) {
+ fn();
+ });
+ }
+
+ addListener(function () {
+ if (!remainingTasks) {
+ callback(null, results);
+ }
+ });
+
+ _arrayEach(keys, function (k) {
+ var task = _isArray(tasks[k]) ? tasks[k]: [tasks[k]];
+ var taskCallback = _restParam(function(err, args) {
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ if (err) {
+ var safeResults = {};
+ _forEachOf(results, function(val, rkey) {
+ safeResults[rkey] = val;
+ });
+ safeResults[k] = args;
+ callback(err, safeResults);
+ }
+ else {
+ results[k] = args;
+ async.setImmediate(taskComplete);
+ }
+ });
+ var requires = task.slice(0, task.length - 1);
+ // prevent dead-locks
+ var len = requires.length;
+ var dep;
+ while (len--) {
+ if (!(dep = tasks[requires[len]])) {
+ throw new Error('Has inexistant dependency');
+ }
+ if (_isArray(dep) && _indexOf(dep, k) >= 0) {
+ throw new Error('Has cyclic dependencies');
+ }
+ }
+ function ready() {
+ return _reduce(requires, function (a, x) {
+ return (a && results.hasOwnProperty(x));
+ }, true) && !results.hasOwnProperty(k);
+ }
+ if (ready()) {
+ task[task.length - 1](taskCallback, results);
+ }
+ else {
+ addListener(listener);
+ }
+ function listener() {
+ if (ready()) {
+ removeListener(listener);
+ task[task.length - 1](taskCallback, results);
+ }
+ }
+ });
+ };
+
+
+
+ async.retry = function(times, task, callback) {
+ var DEFAULT_TIMES = 5;
+ var DEFAULT_INTERVAL = 0;
+
+ var attempts = [];
+
+ var opts = {
+ times: DEFAULT_TIMES,
+ interval: DEFAULT_INTERVAL
+ };
+
+ function parseTimes(acc, t){
+ if(typeof t === 'number'){
+ acc.times = parseInt(t, 10) || DEFAULT_TIMES;
+ } else if(typeof t === 'object'){
+ acc.times = parseInt(t.times, 10) || DEFAULT_TIMES;
+ acc.interval = parseInt(t.interval, 10) || DEFAULT_INTERVAL;
+ } else {
+ throw new Error('Unsupported argument type for \'times\': ' + typeof(t));
+ }
+ }
+
+ 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) {
+ return function(seriesCallback) {
+ task(function(err, result){
+ seriesCallback(!err || finalAttempt, {err: err, result: result});
+ }, wrappedResults);
+ };
+ }
+
+ function retryInterval(interval){
+ return function(seriesCallback){
+ setTimeout(function(){
+ seriesCallback(null);
+ }, interval);
+ };
+ }
+
+ while (opts.times) {
+
+ var finalAttempt = !(opts.times-=1);
+ attempts.push(retryAttempt(opts.task, finalAttempt));
+ if(!finalAttempt && opts.interval > 0){
+ attempts.push(retryInterval(opts.interval));
+ }
+ }
+
+ async.series(attempts, function(done, data){
+ data = data[data.length - 1];
+ (wrappedCallback || opts.callback)(data.err, data.result);
+ });
+ }
+
+ // If a callback is passed, run this as a controll flow
+ return opts.callback ? wrappedTask() : wrappedTask;
+ };
+
+ async.waterfall = function (tasks, callback) {
+ callback = _once(callback || noop);
+ if (!_isArray(tasks)) {
+ var err = new Error('First argument to waterfall must be an array of functions');
+ return callback(err);
+ }
+ if (!tasks.length) {
+ return callback();
+ }
+ function wrapIterator(iterator) {
+ return _restParam(function (err, args) {
+ if (err) {
+ callback.apply(null, [err].concat(args));
+ }
+ else {
+ var next = iterator.next();
+ if (next) {
+ args.push(wrapIterator(next));
+ }
+ else {
+ args.push(callback);
+ }
+ ensureAsync(iterator).apply(null, args);
+ }
+ });
+ }
+ wrapIterator(async.iterator(tasks))();
+ };
+
+ function _parallel(eachfn, tasks, callback) {
+ callback = callback || noop;
+ var results = _isArrayLike(tasks) ? [] : {};
+
+ eachfn(tasks, function (task, key, callback) {
+ task(_restParam(function (err, args) {
+ if (args.length <= 1) {
+ args = args[0];
+ }
+ results[key] = args;
+ callback(err);
+ }));
+ }, function (err) {
+ callback(err, results);
+ });
+ }
+
+ async.parallel = function (tasks, callback) {
+ _parallel(async.eachOf, tasks, callback);
+ };
+
+ async.parallelLimit = function(tasks, limit, callback) {
+ _parallel(_eachOfLimit(limit), tasks, callback);
+ };
+
+ async.series = function(tasks, callback) {
+ _parallel(async.eachOfSeries, tasks, callback);
+ };
+
+ async.iterator = function (tasks) {
+ function makeCallback(index) {
+ function fn() {
+ if (tasks.length) {
+ tasks[index].apply(null, arguments);
+ }
+ return fn.next();
+ }
+ fn.next = function () {
+ return (index < tasks.length - 1) ? makeCallback(index + 1): null;
+ };
+ return fn;
+ }
+ return makeCallback(0);
+ };
+
+ async.apply = _restParam(function (fn, args) {
+ return _restParam(function (callArgs) {
+ return fn.apply(
+ null, args.concat(callArgs)
+ );
+ });
+ });
+
+ function _concat(eachfn, arr, fn, callback) {
+ var result = [];
+ eachfn(arr, function (x, index, cb) {
+ fn(x, function (err, y) {
+ result = result.concat(y || []);
+ cb(err);
+ });
+ }, function (err) {
+ callback(err, result);
+ });
+ }
+ async.concat = doParallel(_concat);
+ async.concatSeries = doSeries(_concat);
+
+ async.whilst = function (test, iterator, callback) {
+ callback = callback || noop;
+ if (test()) {
+ var next = _restParam(function(err, args) {
+ if (err) {
+ callback(err);
+ } else if (test.apply(this, args)) {
+ iterator(next);
+ } else {
+ callback(null);
+ }
+ });
+ iterator(next);
+ } else {
+ callback(null);
+ }
+ };
+
+ async.doWhilst = function (iterator, test, callback) {
+ var calls = 0;
+ return async.whilst(function() {
+ return ++calls <= 1 || test.apply(this, arguments);
+ }, iterator, callback);
+ };
+
+ async.until = function (test, iterator, callback) {
+ return async.whilst(function() {
+ return !test.apply(this, arguments);
+ }, iterator, callback);
+ };
+
+ async.doUntil = function (iterator, test, callback) {
+ return async.doWhilst(iterator, function() {
+ return !test.apply(this, arguments);
+ }, callback);
+ };
+
+ async.during = function (test, iterator, callback) {
+ callback = callback || noop;
+
+ var next = _restParam(function(err, args) {
+ if (err) {
+ callback(err);
+ } else {
+ args.push(check);
+ test.apply(this, args);
+ }
+ });
+
+ 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) {
+ var calls = 0;
+ async.during(function(next) {
+ if (calls++ < 1) {
+ next(null, true);
+ } else {
+ test.apply(this, arguments);
+ }
+ }, iterator, callback);
+ };
+
+ function _queue(worker, concurrency, payload) {
+ if (concurrency == null) {
+ concurrency = 1;
+ }
+ else if(concurrency === 0) {
+ throw new Error('Concurrency must not be zero');
+ }
+ function _insert(q, data, pos, callback) {
+ if (callback != null && typeof callback !== "function") {
+ throw new Error("task callback must be a function");
+ }
+ q.started = true;
+ if (!_isArray(data)) {
+ data = [data];
+ }
+ if(data.length === 0 && q.idle()) {
+ // call drain immediately if there are no tasks
+ return async.setImmediate(function() {
+ q.drain();
+ });
+ }
+ _arrayEach(data, function(task) {
+ var item = {
+ data: task,
+ callback: callback || noop
+ };
+
+ if (pos) {
+ q.tasks.unshift(item);
+ } else {
+ q.tasks.push(item);
+ }
+
+ if (q.tasks.length === q.concurrency) {
+ q.saturated();
+ }
+ });
+ async.setImmediate(q.process);
+ }
+ function _next(q, tasks) {
+ return function(){
+ workers -= 1;
+ var args = arguments;
+ _arrayEach(tasks, function (task) {
+ task.callback.apply(task, args);
+ });
+ if (q.tasks.length + workers === 0) {
+ q.drain();
+ }
+ q.process();
+ };
+ }
+
+ var workers = 0;
+ var q = {
+ tasks: [],
+ concurrency: concurrency,
+ payload: payload,
+ saturated: noop,
+ empty: noop,
+ drain: noop,
+ started: false,
+ paused: false,
+ push: function (data, callback) {
+ _insert(q, data, false, callback);
+ },
+ kill: function () {
+ q.drain = noop;
+ q.tasks = [];
+ },
+ unshift: function (data, callback) {
+ _insert(q, data, true, callback);
+ },
+ process: function () {
+ if (!q.paused && workers < q.concurrency && q.tasks.length) {
+ while(workers < q.concurrency && q.tasks.length){
+ var tasks = q.payload ?
+ q.tasks.splice(0, q.payload) :
+ q.tasks.splice(0, q.tasks.length);
+
+ var data = _map(tasks, function (task) {
+ return task.data;
+ });
+
+ if (q.tasks.length === 0) {
+ q.empty();
+ }
+ workers += 1;
+ var cb = only_once(_next(q, tasks));
+ worker(data, cb);
+ }
+ }
+ },
+ length: function () {
+ return q.tasks.length;
+ },
+ running: function () {
+ return workers;
+ },
+ idle: function() {
+ return q.tasks.length + workers === 0;
+ },
+ pause: function () {
+ q.paused = true;
+ },
+ resume: function () {
+ if (q.paused === false) { return; }
+ q.paused = false;
+ var resumeCount = Math.min(q.concurrency, q.tasks.length);
+ // Need to call q.process once per concurrent
+ // worker to preserve full concurrency after pause
+ for (var w = 1; w <= resumeCount; w++) {
+ async.setImmediate(q.process);
+ }
+ }
+ };
+ return q;
+ }
+
+ async.queue = function (worker, concurrency) {
+ var q = _queue(function (items, cb) {
+ worker(items[0], cb);
+ }, concurrency, 1);
+
+ return q;
+ };
+
+ async.priorityQueue = function (worker, concurrency) {
+
+ function _compareTasks(a, b){
+ return a.priority - b.priority;
+ }
+
+ function _binarySearch(sequence, item, compare) {
+ var beg = -1,
+ end = sequence.length - 1;
+ while (beg < end) {
+ var mid = beg + ((end - beg + 1) >>> 1);
+ if (compare(item, sequence[mid]) >= 0) {
+ beg = mid;
+ } else {
+ end = mid - 1;
+ }
+ }
+ return beg;
+ }
+
+ function _insert(q, data, priority, callback) {
+ if (callback != null && typeof callback !== "function") {
+ throw new Error("task callback must be a function");
+ }
+ q.started = true;
+ if (!_isArray(data)) {
+ data = [data];
+ }
+ if(data.length === 0) {
+ // call drain immediately if there are no tasks
+ return async.setImmediate(function() {
+ q.drain();
+ });
+ }
+ _arrayEach(data, function(task) {
+ var item = {
+ data: task,
+ priority: priority,
+ callback: typeof callback === 'function' ? callback : noop
+ };
+
+ q.tasks.splice(_binarySearch(q.tasks, item, _compareTasks) + 1, 0, item);
+
+ if (q.tasks.length === q.concurrency) {
+ q.saturated();
+ }
+ async.setImmediate(q.process);
+ });
+ }
+
+ // Start with a normal queue
+ var q = async.queue(worker, concurrency);
+
+ // Override push to accept second parameter representing priority
+ q.push = function (data, priority, callback) {
+ _insert(q, data, priority, callback);
+ };
+
+ // Remove unshift function
+ delete q.unshift;
+
+ return q;
+ };
+
+ async.cargo = function (worker, payload) {
+ return _queue(worker, 1, payload);
+ };
+
+ function _console_fn(name) {
+ return _restParam(function (fn, args) {
+ fn.apply(null, args.concat([_restParam(function (err, args) {
+ if (typeof console !== 'undefined') {
+ if (err) {
+ if (console.error) {
+ console.error(err);
+ }
+ }
+ else if (console[name]) {
+ _arrayEach(args, function (x) {
+ console[name](x);
+ });
+ }
+ }
+ })]));
+ });
+ }
+ async.log = _console_fn('log');
+ async.dir = _console_fn('dir');
+ /*async.info = _console_fn('info');
+ async.warn = _console_fn('warn');
+ async.error = _console_fn('error');*/
+
+ async.memoize = function (fn, hasher) {
+ var memo = {};
+ var queues = {};
+ hasher = hasher || identity;
+ var memoized = _restParam(function memoized(args) {
+ var callback = args.pop();
+ var key = hasher.apply(null, args);
+ if (key in memo) {
+ async.nextTick(function () {
+ callback.apply(null, memo[key]);
+ });
+ }
+ else if (key in queues) {
+ queues[key].push(callback);
+ }
+ else {
+ queues[key] = [callback];
+ fn.apply(null, args.concat([_restParam(function (args) {
+ memo[key] = args;
+ var q = queues[key];
+ delete queues[key];
+ for (var i = 0, l = q.length; i < l; i++) {
+ q[i].apply(null, args);
+ }
+ })]));
+ }
+ });
+ memoized.memo = memo;
+ memoized.unmemoized = fn;
+ return memoized;
+ };
+
+ async.unmemoize = function (fn) {
+ return function () {
+ return (fn.unmemoized || fn).apply(null, arguments);
+ };
+ };
+
+ function _times(mapper) {
+ return function (count, iterator, callback) {
+ mapper(_range(count), iterator, callback);
+ };
+ }
+
+ async.times = _times(async.map);
+ async.timesSeries = _times(async.mapSeries);
+ async.timesLimit = function (count, limit, iterator, callback) {
+ return async.mapLimit(_range(count), limit, iterator, callback);
+ };
+
+ async.seq = function (/* functions... */) {
+ var fns = arguments;
+ return _restParam(function (args) {
+ var that = this;
+
+ var callback = args[args.length - 1];
+ if (typeof callback == 'function') {
+ args.pop();
+ } else {
+ callback = noop;
+ }
+
+ async.reduce(fns, args, function (newargs, fn, cb) {
+ fn.apply(that, newargs.concat([_restParam(function (err, nextargs) {
+ cb(err, nextargs);
+ })]));
+ },
+ function (err, results) {
+ callback.apply(that, [err].concat(results));
+ });
+ });
+ };
+
+ async.compose = function (/* functions... */) {
+ return async.seq.apply(null, Array.prototype.reverse.call(arguments));
+ };
+
+
+ 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;
+ }
+ });
+ }
+
+ async.applyEach = _applyEach(async.eachOf);
+ async.applyEachSeries = _applyEach(async.eachOfSeries);
+
+
+ async.forever = function (fn, callback) {
+ var done = only_once(callback || noop);
+ var task = ensureAsync(fn);
+ function next(err) {
+ if (err) {
+ return done(err);
+ }
+ task(next);
+ }
+ next();
+ };
+
+ function ensureAsync(fn) {
+ return _restParam(function (args) {
+ var callback = args.pop();
+ args.push(function () {
+ var innerArgs = arguments;
+ if (sync) {
+ async.setImmediate(function () {
+ callback.apply(null, innerArgs);
+ });
+ } else {
+ callback.apply(null, innerArgs);
+ }
+ });
+ var sync = true;
+ fn.apply(this, args);
+ sync = false;
+ });
+ }
+
+ async.ensureAsync = ensureAsync;
+
+ async.constant = _restParam(function(values) {
+ var args = [null].concat(values);
+ return function (callback) {
+ return callback.apply(this, args);
+ };
+ });
+
+ async.wrapSync =
+ async.asyncify = function asyncify(func) {
+ return _restParam(function (args) {
+ var callback = args.pop();
+ var result;
+ try {
+ result = func.apply(this, args);
+ } catch (e) {
+ return callback(e);
+ }
+ // if result is Promise object
+ if (typeof result !== 'undefined' && typeof result.then === "function") {
+ result.then(function(value) {
+ callback(null, value);
+ }).catch(function(err) {
+ callback(err.message ? err : new Error(err));
+ });
+ } else {
+ callback(null, result);
+ }
+ });
+ };
+
+ // Node.js
+ if (typeof module !== 'undefined' && module.exports) {
+ module.exports = async;
+ }
+ // AMD / RequireJS
+ else if (typeof define !== 'undefined' && define.amd) {
+ define([], function () {
+ return async;
+ });
+ }
+ // included directly via <script> tag
+ else {
+ root.async = async;
+ }
+
+}());
diff --git a/dist/async.min.js b/dist/async.min.js
index 42db398..cfd9161 100644
--- a/dist/async.min.js
+++ b/dist/async.min.js
@@ -1 +1,2 @@
-!function(){function n(){}function t(n){var t=!1;return function(){if(t)throw new Error("Callback was already called.");t=!0,n.apply(this,arguments)}}function e(n){var t=!1;return function(){t||(t=!0,n.apply(this,arguments))}}function r(n){return P(n)||"number"==typeof n.length&&n.length>=0&&n.length%1===0}function u(n,t){return r(n)?i(n,t):f(n,t)}function i(n,t){for(var e=-1,r=n.length;++e<r;)t(n[e],e,n)}function o(n,t){for(var e=-1,r=n.length,u=Array(r);++e<r;)u[e]=t(n[e],e,n);return u}function c(n){return o(Array(n),function(n,t){return t})}function a(n,t,e){return i(n,function(n,r,u){e=t(e,n,r,u)}),e}function f(n,t){i(U(n),function(e){t(n[e],e)})}function l(n){var t,e,u=-1;return r(n)?(t=n.length,function(){return u++,t>u?u:null}):(e=U(n),t=e.length,function(){return u++,t>u?e[u]:null})}function s(n,t){t=t||0;var e=-1,r=n.length;t&&(r-=t,r=0>r?0:r);for(var u=Array(r);++e<r;)u[e]=n[e+t];return u}function p(n){return function(t,e,r){return n(t,r)}}function m(r){return function(u,i,o){o=e(o||n),u=u||[];var c=l(u);if(0>=r)return o(null);var a=!1,f=0,s=!1;!function p(){if(a&&0>=f)return o(null);for(;r>f&&!s;){var n=c();if(null===n)return a=!0,void(0>=f&&o(null));f+=1,i(u[n],n,t(function(n){f-=1,n?(o(n),s=!0):p()}))}}()}}function h(n){return function(t,e,r){return n(L.eachOf,t,e,r)}}function g(n,t){return function(e,r,u){return t(m(n),e,r,u)}}function d(n){return function(t,e,r){return n(L.eachOfSeries,t,e,r)}}function v(t,r,u,i){i=e(i||n);var o=[];t(r,function(n,t,e){u(n,function(n,r){o[t]=r,e(n)})},function(n){i(n,o)})}function y(n){return g(n,v)}function k(n,t,e,r){var u=[];t=o(t,function(n,t){return{index:t,value:n}}),n(t,function(n,t,r){e(n.value,function(t){t&&u.push(n),r()})},function(){r(o(u.sort(function(n,t){return n.index-t.index}),function(n){return n.value}))})}function b(n,t,e,r){k(n,t,function(n,t){e(n,function(n){t(!n)})},r)}function w(t,e,r,u){t(e,function(t,e,i){r(t,function(e){e?(u(t),u=n):i()})},function(){u()})}function O(t,e,u){u=u||n;var i=r(e)?[]:{};t(e,function(n,t,e){n(function(n){var r=s(arguments,1);r.length<=1&&(r=r[0]),i[t]=r,e(n)})},function(n){u(n,i)})}function x(n,t,e,r){var u=[];n(t,function(n,t,r){e(n,function(n,t){u=u.concat(t||[]),r(n)})},function(n){r(n,u)})}function S(e,r,u){function c(t,e,r,u){if(null!=u&&"function"!=typeof u)throw new Error("task callback must be a function");return t.started=!0,P(e)||(e=[e]),0===e.length&&t.idle()?L.setImmediate(function(){t.drain()}):(i(e,function(e){var i={data:e,callback:u||n};r?t.tasks.unshift(i):t.tasks.push(i),t.tasks.length===t.concurrency&&t.saturated()}),void L.setImmediate(t.process))}function a(n,t){return function(){f-=1;var e=arguments;i(t,function(n){n.callback.apply(n,e)}),n.tasks.length+f===0&&n.drain(),n.process()}}if(null==r)r=1;else if(0===r)throw new Error("Concurrency must not be zero");var f=0,l={tasks:[],concurrency:r,payload:u,saturated:n,empty:n,drain:n,started:!1,paused:!1,push:function(n,t){c(l,n,!1,t)},kill:function(){l.drain=n,l.tasks=[]},unshift:function(n,t){c(l,n,!0,t)},process:function(){if(!l.paused&&f<l.concurrency&&l.tasks.length)for(;f<l.concurrency&&l.tasks.length;){var n=l.payload?l.tasks.splice(0,l.payload):l.tasks.splice(0,l.tasks.length),r=o(n,function(n){return n.data});0===l.tasks.length&&l.empty(),f+=1;var u=t(a(l,n));e(r,u)}},length:function(){return l.tasks.length},running:function(){return f},idle:function(){return l.tasks.length+f===0},pause:function(){l.paused=!0},resume:function(){if(l.paused!==!1){l.paused=!1;for(var n=Math.min(l.concurrency,l.tasks.length),t=1;n>=t;t++)L.setImmediate(l.process)}}};return l}function E(n){return function(t){var e=s(arguments,1);t.apply(null,e.concat([function(t){var e=s(arguments,1);"undefined"!=typeof console&&(t?console.error&&console.error(t):console[n]&&i(e,function(t){console[n](t)}))}]))}}function I(n){return function(t,e,r){n(c(t),e,r)}}function T(n,t){function e(){var e=this,r=s(arguments),u=r.pop();return n(t,function(n,t,u){n.apply(e,r.concat([u]))},u)}if(arguments.length>2){var r=s(arguments,2);return e.apply(this,r)}return e}function j(n){return function(){var t=s(arguments),e=t.pop();t.push(function(){var n=arguments;r?L.setImmediate(function(){e.apply(null,n)}):e.apply(null,n)});var r=!0;n.apply(this,t),r=!1}}var A,L={},z="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||this;null!=z&&(A=z.async),L.noConflict=function(){return z.async=A,L};var q,C=Object.prototype.toString,P=Array.isArray||function(n){return"[object Array]"===C.call(n)},U=Object.keys||function(n){var t=[];for(var e in n)n.hasOwnProperty(e)&&t.push(e);return t};"function"==typeof setImmediate&&(q=setImmediate),"undefined"!=typeof process&&process.nextTick?(L.nextTick=process.nextTick,q?L.setImmediate=function(n){q(n)}:L.setImmediate=L.nextTick):q?(L.nextTick=function(n){q(n)},L.setImmediate=L.nextTick):(L.nextTick=function(n){setTimeout(n,0)},L.setImmediate=L.nextTick),L.forEach=L.each=function(n,t,e){return L.eachOf(n,p(t),e)},L.forEachSeries=L.eachSeries=function(n,t,e){return L.eachOfSeries(n,p(t),e)},L.forEachLimit=L.eachLimit=function(n,t,e,r){return m(t)(n,p(e),r)},L.forEachOf=L.eachOf=function(i,o,c){function a(n){n?c(n):(l+=1,l>=f&&c(null))}c=e(c||n),i=i||[];var f=r(i)?i.length:U(i).length,l=0;return f?void u(i,function(n,e){o(i[e],e,t(a))}):c(null)},L.forEachOfSeries=L.eachOfSeries=function(r,u,i){function o(){var n=!0;return null===a?i(null):(u(r[a],a,t(function(t){if(t)i(t);else{if(a=c(),null===a)return i(null);n?L.nextTick(o):o()}})),void(n=!1))}i=e(i||n),r=r||[];var c=l(r),a=c();o()},L.forEachOfLimit=L.eachOfLimit=function(n,t,e,r){m(t)(n,e,r)},L.map=h(v),L.mapSeries=d(v),L.mapLimit=function(n,t,e,r){return y(t)(n,e,r)},L.inject=L.foldl=L.reduce=function(n,t,e,r){L.eachOfSeries(n,function(n,r,u){e(t,n,function(n,e){t=e,u(n)})},function(n){r(n||null,t)})},L.foldr=L.reduceRight=function(n,t,e,r){var u=o(n,function(n){return n}).reverse();L.reduce(u,t,e,r)},L.select=L.filter=h(k),L.selectSeries=L.filterSeries=d(k),L.reject=h(b),L.rejectSeries=d(b),L.detect=h(w),L.detectSeries=d(w),L.any=L.some=function(t,e,r){L.eachOf(t,function(t,u,i){e(t,function(t){t&&(r(!0),r=n),i()})},function(){r(!1)})},L.all=L.every=function(t,e,r){L.eachOf(t,function(t,u,i){e(t,function(t){t||(r(!1),r=n),i()})},function(){r(!0)})},L.sortBy=function(n,t,e){function r(n,t){var e=n.criteria,r=t.criteria;return r>e?-1:e>r?1:0}L.map(n,function(n,e){t(n,function(t,r){t?e(t):e(null,{value:n,criteria:r})})},function(n,t){return n?e(n):void e(null,o(t.sort(r),function(n){return n.value}))})},L.auto=function(t,r){function u(n){m.unshift(n)}function o(n){for(var t=0;t<m.length;t+=1)if(m[t]===n)return void m.splice(t,1)}function c(){l--,i(m.slice(0),function(n){n()})}r=e(r||n);var f=U(t),l=f.length;if(!l)return r(null);var p={},m=[];u(function(){l||r(null,p)}),i(f,function(n){function e(t){var e=s(arguments,1);if(e.length<=1&&(e=e[0]),t){var u={};i(U(p),function(n){u[n]=p[n]}),u[n]=e,r(t,u)}else p[n]=e,L.setImmediate(c)}function f(){return a(g,function(n,t){return n&&p.hasOwnProperty(t)},!0)&&!p.hasOwnProperty(n)}function l(){f()&&(o(l),h[h.length-1](e,p))}for(var m,h=P(t[n])?t[n]:[t[n]],g=h.slice(0,Math.abs(h.length-1))||[],d=g.length;d--;){if(!(m=t[g[d]]))throw new Error("Has inexistant dependency");if(P(m)&&~m.indexOf(n))throw new Error("Has cyclic dependencies")}f()?h[h.length-1](e,p):u(l)})},L.retry=function(){function n(n,t){if("number"==typeof t)n.times=parseInt(t,10)||e;else{if("object"!=typeof t)throw new Error("Unsupported argument type for 'times': "+typeof t);n.times=parseInt(t.times,10)||e,n.interval=parseInt(t.interval,10)||r}}function t(n,t){function e(n,e){return function(r){n(function(n,t){r(!n||e,{err:n,result:t})},t)}}function r(n){return function(t){setTimeout(function(){t(null)},n)}}for(;i.times;){var o=!(i.times-=1);u.push(e(i.task,o)),!o&&i.interval>0&&u.push(r(i.interval))}L.series(u,function(t,e){e=e[e.length-1],(n||i.callback)(e.err,e.result)})}var e=5,r=0,u=[],i={times:e,interval:r};switch(arguments.length){case 1:i.task=arguments[0];break;case 2:"number"==typeof arguments[0]||"object"==typeof arguments[0]?(n(i,arguments[0]),i.task=arguments[1]):(i.task=arguments[0],i.callback=arguments[1]);break;case 3:n(i,arguments[0]),i.task=arguments[1],i.callback=arguments[2];break;default:throw new Error("Invalid arguments - must be either (task), (task, callback), (times, task) or (times, task, callback)")}return i.callback?t():t},L.waterfall=function(t,r){function u(n){return function(t){if(t)r.apply(null,arguments);else{var e=s(arguments,1),i=n.next();i?e.push(u(i)):e.push(r),j(n).apply(null,e)}}}if(r=e(r||n),!P(t)){var i=new Error("First argument to waterfall must be an array of functions");return r(i)}return t.length?void u(L.iterator(t))():r()},L.parallel=function(n,t){O(L.eachOf,n,t)},L.parallelLimit=function(n,t,e){O(m(t),n,e)},L.series=function(t,e){e=e||n;var u=r(t)?[]:{};L.eachOfSeries(t,function(n,t,e){n(function(n){var r=s(arguments,1);r.length<=1&&(r=r[0]),u[t]=r,e(n)})},function(n){e(n,u)})},L.iterator=function(n){function t(e){function r(){return n.length&&n[e].apply(null,arguments),r.next()}return r.next=function(){return e<n.length-1?t(e+1):null},r}return t(0)},L.apply=function(n){var t=s(arguments,1);return function(){return n.apply(null,t.concat(s(arguments)))}},L.concat=h(x),L.concatSeries=d(x),L.whilst=function(t,e,r){r=r||n,t()?e(function(n){return n?r(n):void L.whilst(t,e,r)}):r(null)},L.doWhilst=function(t,e,r){r=r||n,t(function(n){if(n)return r(n);var u=s(arguments,1);e.apply(null,u)?L.doWhilst(t,e,r):r(null)})},L.until=function(t,e,r){r=r||n,t()?r(null):e(function(n){return n?r(n):void L.until(t,e,r)})},L.doUntil=function(t,e,r){r=r||n,t(function(n){if(n)return r(n);var u=s(arguments,1);e.apply(null,u)?r(null):L.doUntil(t,e,r)})},L.during=function(t,e,r){r=r||n,t(function(n,u){return n?r(n):void(u?e(function(n){return n?r(n):void L.during(t,e,r)}):r(null))})},L.doDuring=function(t,e,r){r=r||n,t(function(n){if(n)return r(n);var u=s(arguments,1);u.push(function(n,u){return n?r(n):void(u?L.doDuring(t,e,r):r(null))}),e.apply(null,u)})},L.queue=function(n,t){var e=S(function(t,e){n(t[0],e)},t,1);return e},L.priorityQueue=function(t,e){function r(n,t){return n.priority-t.priority}function u(n,t,e){for(var r=-1,u=n.length-1;u>r;){var i=r+(u-r+1>>>1);e(t,n[i])>=0?r=i:u=i-1}return r}function o(t,e,o,c){if(null!=c&&"function"!=typeof c)throw new Error("task callback must be a function");return t.started=!0,P(e)||(e=[e]),0===e.length?L.setImmediate(function(){t.drain()}):void i(e,function(e){var i={data:e,priority:o,callback:"function"==typeof c?c:n};t.tasks.splice(u(t.tasks,i,r)+1,0,i),t.tasks.length===t.concurrency&&t.saturated(),L.setImmediate(t.process)})}var c=L.queue(t,e);return c.push=function(n,t,e){o(c,n,t,e)},delete c.unshift,c},L.cargo=function(n,t){return S(n,1,t)},L.log=E("log"),L.dir=E("dir"),L.memoize=function(n,t){function e(){var e=s(arguments),i=e.pop(),o=t.apply(null,e);o in r?L.nextTick(function(){i.apply(null,r[o])}):o in u?u[o].push(i):(u[o]=[i],n.apply(null,e.concat([function(){r[o]=s(arguments);var n=u[o];delete u[o];for(var t=0,e=n.length;e>t;t++)n[t].apply(null,arguments)}])))}var r={},u={};return t=t||function(n){return n},e.memo=r,e.unmemoized=n,e},L.unmemoize=function(n){return function(){return(n.unmemoized||n).apply(null,arguments)}},L.times=I(L.map),L.timesSeries=I(L.mapSeries),L.timesLimit=function(n,t,e,r){return L.mapLimit(c(n),t,e,r)},L.seq=function(){var t=arguments;return function(){var e=this,r=s(arguments),u=r.slice(-1)[0];"function"==typeof u?r.pop():u=n,L.reduce(t,r,function(n,t,r){t.apply(e,n.concat([function(){var n=arguments[0],t=s(arguments,1);r(n,t)}]))},function(n,t){u.apply(e,[n].concat(t))})}},L.compose=function(){return L.seq.apply(null,Array.prototype.reverse.call(arguments))},L.applyEach=function(){var n=s(arguments);return T.apply(null,[L.eachOf].concat(n))},L.applyEachSeries=function(){var n=s(arguments);return T.apply(null,[L.eachOfSeries].concat(n))},L.forever=function(e,r){function u(n){return n?i(n):void o(u)}var i=t(r||n),o=j(e);u()},L.ensureAsync=j,L.constant=function(){var n=[null].concat(s(arguments));return function(t){return t.apply(this,n)}},L.wrapSync=L.asyncify=function(n){return function(){var t,e=s(arguments),r=e.pop();try{t=n.apply(this,e)}catch(u){return r(u)}r(null,t)}},"undefined"!=typeof module&&module.exports?module.exports=L:"undefined"!=typeof define&&define.amd?define([],function(){return L}):z.async=L}();
+!function(){function n(){}function t(n){return n}function e(n){return!!n}function r(n){return!n}function u(n){return function(){if(null===n)throw new Error("Callback was already called.");n.apply(this,arguments),n=null}}function i(n){return function(){null!==n&&(n.apply(this,arguments),n=null)}}function o(n){return U(n)||"number"==typeof n.length&&n.length>=0&&n.length%1===0}function c(n,t){return o(n)?a(n,t):p(n,t)}function a(n,t){for(var e=-1,r=n.length;++e<r;)t(n[e],e,n)}function f(n,t){for(var e=-1,r=n.length,u=Array(r);++e<r;)u[e]=t(n[e],e,n);return u}function l(n){return f(Array(n),function(n,t){return t})}function s(n,t,e){return a(n,function(n,r,u){e=t(e,n,r,u)}),e}function p(n,t){a(W(n),function(e){t(n[e],e)})}function h(n,t){for(var e=0;e<n.length;e++)if(n[e]===t)return e;return-1}function m(n){var t,e,r=-1;return o(n)?(t=n.length,function(){return r++,t>r?r:null}):(e=W(n),t=e.length,function(){return r++,t>r?e[r]:null})}function y(n,t){return t=null==t?n.length-1:+t,function(){for(var e=Math.max(arguments.length-t,0),r=Array(e),u=0;e>u;u++)r[u]=arguments[u+t];switch(t){case 0:return n.call(this,r);case 1:return n.call(this,arguments[0],r);case 2:return n.call(this,arguments[0],arguments[1],r)}}}function d(n){return function(t,e,r){return n(t,r)}}function v(t){return function(e,r,o){o=i(o||n),e=e||[];var c=m(e);if(0>=t)return o(null);var a=!1,f=0,l=!1;!function s(){if(a&&0>=f)return o(null);for(;t>f&&!l;){var n=c();if(null===n)return a=!0,void(0>=f&&o(null));f+=1,r(e[n],n,u(function(n){f-=1,n?(o(n),l=!0):s()}))}}()}}function g(n){return function(t,e,r){return n(P.eachOf,t,e,r)}}function k(n){return function(t,e,r,u){return n(v(e),t,r,u)}}function b(n){return function(t,e,r){return n(P.eachOfSeries,t,e,r)}}function w(t,e,r,u){u=i(u||n);var o=[];t(e,function(n,t,e){r(n,function(n,r){o[t]=r,e(n)})},function(n){u(n,o)})}function O(n,t,e,r){var u=[];n(t,function(n,t,r){e(n,function(e){e&&u.push({index:t,value:n}),r()})},function(){r(f(u.sort(function(n,t){return n.index-t.index}),function(n){return n.value}))})}function S(n,t,e,r){O(n,t,function(n,t){e(n,function(n){t(!n)})},r)}function E(n,t,e){return function(r,u,i,o){function c(){o&&o(e(!1,void 0))}function a(n,r,u){return o?void i(n,function(r){o&&t(r)&&(o(e(!0,n)),o=i=!1),u()}):u()}arguments.length>3?n(r,u,a,c):(o=i,i=u,n(r,a,c))}}function x(n,t){return t}function L(t,e,r){r=r||n;var u=o(e)?[]:{};t(e,function(n,t,e){n(y(function(n,r){r.length<=1&&(r=r[0]),u[t]=r,e(n)}))},function(n){r(n,u)})}function I(n,t,e,r){var u=[];n(t,function(n,t,r){e(n,function(n,t){u=u.concat(t||[]),r(n)})},function(n){r(n,u)})}function j(t,e,r){function i(t,e,r,u){if(null!=u&&"function"!=typeof u)throw new Error("task callback must be a function");return t.started=!0,U(e)||(e=[e]),0===e.length&&t.idle()?P.setImmediate(function(){t.drain()}):(a(e,function(e){var i={data:e,callback:u||n};r?t.tasks.unshift(i):t.tasks.push(i),t.tasks.length===t.concurrency&&t.saturated()}),void P.setImmediate(t.process))}function o(n,t){return function(){c-=1;var e=arguments;a(t,function(n){n.callback.apply(n,e)}),n.tasks.length+c===0&&n.drain(),n.process()}}if(null==e)e=1;else if(0===e)throw new Error("Concurrency must not be zero");var c=0,l={tasks:[],concurrency:e,payload:r,saturated:n,empty:n,drain:n,started:!1,paused:!1,push:function(n,t){i(l,n,!1,t)},kill:function(){l.drain=n,l.tasks=[]},unshift:function(n,t){i(l,n,!0,t)},process:function(){if(!l.paused&&c<l.concurrency&&l.tasks.length)for(;c<l.concurrency&&l.tasks.length;){var n=l.payload?l.tasks.splice(0,l.payload):l.tasks.splice(0,l.tasks.length),e=f(n,function(n){return n.data});0===l.tasks.length&&l.empty(),c+=1;var r=u(o(l,n));t(e,r)}},length:function(){return l.tasks.length},running:function(){return c},idle:function(){return l.tasks.length+c===0},pause:function(){l.paused=!0},resume:function(){if(l.paused!==!1){l.paused=!1;for(var n=Math.min(l.concurrency,l.tasks.length),t=1;n>=t;t++)P.setImmediate(l.process)}}};return l}function T(n){return y(function(t,e){t.apply(null,e.concat([y(function(t,e){"undefined"!=typeof console&&(t?console.error&&console.error(t):console[n]&&a(e,function(t){console[n](t)}))})]))})}function A(n){return function(t,e,r){n(l(t),e,r)}}function z(n){return y(function(t,e){var r=y(function(e){var r=this,u=e.pop();return n(t,function(n,t,u){n.apply(r,e.concat([u]))},u)});return e.length?r.apply(this,e):r})}function q(n){return y(function(t){var e=t.pop();t.push(function(){var n=arguments;r?P.setImmediate(function(){e.apply(null,n)}):e.apply(null,n)});var r=!0;n.apply(this,t),r=!1})}var C,P={},H="object"==typeof self&&self.self===self&&self||"object"==typeof global&&global.global===global&&global||this;null!=H&&(C=H.async),P.noConflict=function(){return H.async=C,P};var M=Object.prototype.toString,U=Array.isArray||function(n){return"[object Array]"===M.call(n)},W=Object.keys||function(n){var t=[];for(var e in n)n.hasOwnProperty(e)&&t.push(e);return t},B="function"==typeof setImmediate&&setImmediate,D=B?function(n){B(n)}:function(n){setTimeout(n,0)};"object"==typeof process&&"function"==typeof process.nextTick?P.nextTick=process.nextTick:P.nextTick=D,P.setImmediate=B?D:P.nextTick,P.forEach=P.each=function(n,t,e){return P.eachOf(n,d(t),e)},P.forEachSeries=P.eachSeries=function(n,t,e){return P.eachOfSeries(n,d(t),e)},P.forEachLimit=P.eachLimit=function(n,t,e,r){return v(t)(n,d(e),r)},P.forEachOf=P.eachOf=function(t,e,r){function a(n){n?r(n):(l+=1,l>=f&&r(null))}r=i(r||n),t=t||[];var f=o(t)?t.length:W(t).length,l=0;return f?void c(t,function(n,r){e(t[r],r,u(a))}):r(null)},P.forEachOfSeries=P.eachOfSeries=function(t,e,r){function o(){var n=!0;return null===a?r(null):(e(t[a],a,u(function(t){if(t)r(t);else{if(a=c(),null===a)return r(null);n?P.nextTick(o):o()}})),void(n=!1))}r=i(r||n),t=t||[];var c=m(t),a=c();o()},P.forEachOfLimit=P.eachOfLimit=function(n,t,e,r){v(t)(n,e,r)},P.map=g(w),P.mapSeries=b(w),P.mapLimit=k(w),P.inject=P.foldl=P.reduce=function(n,t,e,r){P.eachOfSeries(n,function(n,r,u){e(t,n,function(n,e){t=e,u(n)})},function(n){r(n||null,t)})},P.foldr=P.reduceRight=function(n,e,r,u){var i=f(n,t).reverse();P.reduce(i,e,r,u)},P.select=P.filter=g(O),P.selectLimit=P.filterLimit=k(O),P.selectSeries=P.filterSeries=b(O),P.reject=g(S),P.rejectLimit=k(S),P.rejectSeries=b(S),P.any=P.some=E(P.eachOf,e,t),P.someLimit=E(P.eachOfLimit,e,t),P.all=P.every=E(P.eachOf,r,r),P.everyLimit=E(P.eachOfLimit,r,r),P.detect=E(P.eachOf,t,x),P.detectSeries=E(P.eachOfSeries,t,x),P.sortBy=function(n,t,e){function r(n,t){var e=n.criteria,r=t.criteria;return r>e?-1:e>r?1:0}P.map(n,function(n,e){t(n,function(t,r){t?e(t):e(null,{value:n,criteria:r})})},function(n,t){return n?e(n):void e(null,f(t.sort(r),function(n){return n.value}))})},P.auto=function(t,e){function r(n){m.unshift(n)}function u(n){var t=h(m,n);t>=0&&m.splice(t,1)}function o(){f--,a(m.slice(0),function(n){n()})}e=i(e||n);var c=W(t),f=c.length;if(!f)return e(null);var l={},m=[];r(function(){f||e(null,l)}),a(c,function(n){function i(){return s(d,function(n,t){return n&&l.hasOwnProperty(t)},!0)&&!l.hasOwnProperty(n)}function c(){i()&&(u(c),f[f.length-1](m,l))}for(var a,f=U(t[n])?t[n]:[t[n]],m=y(function(t,r){if(r.length<=1&&(r=r[0]),t){var u={};p(l,function(n,t){u[t]=n}),u[n]=r,e(t,u)}else l[n]=r,P.setImmediate(o)}),d=f.slice(0,f.length-1),v=d.length;v--;){if(!(a=t[d[v]]))throw new Error("Has inexistant dependency");if(U(a)&&h(a,n)>=0)throw new Error("Has cyclic dependencies")}i()?f[f.length-1](m,l):r(c)})},P.retry=function(n,t,e){function r(n,t){if("number"==typeof t)n.times=parseInt(t,10)||i;else{if("object"!=typeof t)throw new Error("Unsupported argument type for 'times': "+typeof t);n.times=parseInt(t.times,10)||i,n.interval=parseInt(t.interval,10)||o}}function u(n,t){function e(n,e){return function(r){n(function(n,t){r(!n||e,{err:n,result:t})},t)}}function r(n){return function(t){setTimeout(function(){t(null)},n)}}for(;a.times;){var u=!(a.times-=1);c.push(e(a.task,u)),!u&&a.interval>0&&c.push(r(a.interval))}P.series(c,function(t,e){e=e[e.length-1],(n||a.callback)(e.err,e.result)})}var i=5,o=0,c=[],a={times:i,interval:o},f=arguments.length;if(1>f||f>3)throw new Error("Invalid arguments - must be either (task), (task, callback), (times, task) or (times, task, callback)");return 2>=f&&"function"==typeof n&&(e=t,t=n),"function"!=typeof n&&r(a,n),a.callback=e,a.task=t,a.callback?u():u},P.waterfall=function(t,e){function r(n){return y(function(t,u){if(t)e.apply(null,[t].concat(u));else{var i=n.next();i?u.push(r(i)):u.push(e),q(n).apply(null,u)}})}if(e=i(e||n),!U(t)){var u=new Error("First argument to waterfall must be an array of functions");return e(u)}return t.length?void r(P.iterator(t))():e()},P.parallel=function(n,t){L(P.eachOf,n,t)},P.parallelLimit=function(n,t,e){L(v(t),n,e)},P.series=function(n,t){L(P.eachOfSeries,n,t)},P.iterator=function(n){function t(e){function r(){return n.length&&n[e].apply(null,arguments),r.next()}return r.next=function(){return e<n.length-1?t(e+1):null},r}return t(0)},P.apply=y(function(n,t){return y(function(e){return n.apply(null,t.concat(e))})}),P.concat=g(I),P.concatSeries=b(I),P.whilst=function(t,e,r){if(r=r||n,t()){var u=y(function(n,i){n?r(n):t.apply(this,i)?e(u):r(null)});e(u)}else r(null)},P.doWhilst=function(n,t,e){var r=0;return P.whilst(function(){return++r<=1||t.apply(this,arguments)},n,e)},P.until=function(n,t,e){return P.whilst(function(){return!n.apply(this,arguments)},t,e)},P.doUntil=function(n,t,e){return P.doWhilst(n,function(){return!t.apply(this,arguments)},e)},P.during=function(t,e,r){r=r||n;var u=y(function(n,e){n?r(n):(e.push(i),t.apply(this,e))}),i=function(n,t){n?r(n):t?e(u):r(null)};t(i)},P.doDuring=function(n,t,e){var r=0;P.during(function(n){r++<1?n(null,!0):t.apply(this,arguments)},n,e)},P.queue=function(n,t){var e=j(function(t,e){n(t[0],e)},t,1);return e},P.priorityQueue=function(t,e){function r(n,t){return n.priority-t.priority}function u(n,t,e){for(var r=-1,u=n.length-1;u>r;){var i=r+(u-r+1>>>1);e(t,n[i])>=0?r=i:u=i-1}return r}function i(t,e,i,o){if(null!=o&&"function"!=typeof o)throw new Error("task callback must be a function");return t.started=!0,U(e)||(e=[e]),0===e.length?P.setImmediate(function(){t.drain()}):void a(e,function(e){var c={data:e,priority:i,callback:"function"==typeof o?o:n};t.tasks.splice(u(t.tasks,c,r)+1,0,c),t.tasks.length===t.concurrency&&t.saturated(),P.setImmediate(t.process)})}var o=P.queue(t,e);return o.push=function(n,t,e){i(o,n,t,e)},delete o.unshift,o},P.cargo=function(n,t){return j(n,1,t)},P.log=T("log"),P.dir=T("dir"),P.memoize=function(n,e){var r={},u={};e=e||t;var i=y(function(t){var i=t.pop(),o=e.apply(null,t);o in r?P.nextTick(function(){i.apply(null,r[o])}):o in u?u[o].push(i):(u[o]=[i],n.apply(null,t.concat([y(function(n){r[o]=n;var t=u[o];delete u[o];for(var e=0,i=t.length;i>e;e++)t[e].apply(null,n)})])))});return i.memo=r,i.unmemoized=n,i},P.unmemoize=function(n){return function(){return(n.unmemoized||n).apply(null,arguments)}},P.times=A(P.map),P.timesSeries=A(P.mapSeries),P.timesLimit=function(n,t,e,r){return P.mapLimit(l(n),t,e,r)},P.seq=function(){var t=arguments;return y(function(e){var r=this,u=e[e.length-1];"function"==typeof u?e.pop():u=n,P.reduce(t,e,function(n,t,e){t.apply(r,n.concat([y(function(n,t){e(n,t)})]))},function(n,t){u.apply(r,[n].concat(t))})})},P.compose=function(){return P.seq.apply(null,Array.prototype.reverse.call(arguments))},P.applyEach=z(P.eachOf),P.applyEachSeries=z(P.eachOfSeries),P.forever=function(t,e){function r(n){return n?i(n):void o(r)}var i=u(e||n),o=q(t);r()},P.ensureAsync=q,P.constant=y(function(n){var t=[null].concat(n);return function(n){return n.apply(this,t)}}),P.wrapSync=P.asyncify=function(n){return y(function(t){var e,r=t.pop();try{e=n.apply(this,t)}catch(u){return r(u)}"undefined"!=typeof e&&"function"==typeof e.then?e.then(function(n){r(null,n)})["catch"](function(n){r(n.message?n:new Error(n))}):r(null,e)})},"undefined"!=typeof module&&module.exports?module.exports=P:"undefined"!=typeof define&&define.amd?define([],function(){return P}):H.async=P}();
+//# sourceMappingURL=async.min.map \ No newline at end of file
diff --git a/dist/async.min.map b/dist/async.min.map
new file mode 100644
index 0000000..3eba3cb
--- /dev/null
+++ b/dist/async.min.map
@@ -0,0 +1 @@
+{"version":3,"file":"async.min.js","sources":["async.js"],"names":["noop","identity","v","toBool","notId","only_once","fn","Error","apply","this","arguments","_once","_isArrayLike","arr","_isArray","length","_each","coll","iterator","_arrayEach","_forEachOf","index","_map","result","Array","_range","count","i","_reduce","memo","x","a","object","_keys","key","_indexOf","item","_keyIterator","len","keys","_restParam","func","startIndex","Math","max","rest","call","_withoutIndex","value","callback","_eachOfLimit","limit","obj","nextKey","done","running","errored","replenish","err","doParallel","async","eachOf","doParallelLimit","doSeries","eachOfSeries","_asyncMap","eachfn","results","_filter","push","sort","b","_reject","cb","_createTester","check","getResult","iteratee","_","_findGetResult","_parallel","tasks","task","args","_concat","y","concat","_queue","worker","concurrency","payload","_insert","q","data","pos","started","idle","setImmediate","drain","unshift","saturated","process","_next","workers","empty","paused","kill","splice","pause","resume","resumeCount","min","w","_console_fn","name","console","error","_times","mapper","_applyEach","fns","go","that","pop","ensureAsync","innerArgs","sync","previous_async","root","self","global","noConflict","_toString","Object","prototype","toString","isArray","k","hasOwnProperty","_setImmediate","_delay","setTimeout","nextTick","forEach","each","forEachSeries","eachSeries","forEachLimit","eachLimit","forEachOf","completed","size","forEachOfSeries","iterate","forEachOfLimit","eachOfLimit","map","mapSeries","mapLimit","inject","foldl","reduce","foldr","reduceRight","reversed","reverse","select","filter","selectLimit","filterLimit","selectSeries","filterSeries","reject","rejectLimit","rejectSeries","any","some","someLimit","all","every","everyLimit","detect","detectSeries","sortBy","comparator","left","right","criteria","auto","addListener","listeners","removeListener","idx","taskComplete","remainingTasks","slice","ready","requires","listener","taskCallback","dep","safeResults","val","rkey","retry","times","parseTimes","acc","t","parseInt","DEFAULT_TIMES","interval","DEFAULT_INTERVAL","wrappedTask","wrappedCallback","wrappedResults","retryAttempt","finalAttempt","seriesCallback","retryInterval","opts","attempts","series","waterfall","wrapIterator","next","parallel","parallelLimit","makeCallback","callArgs","concatSeries","whilst","test","doWhilst","calls","until","doUntil","during","truth","doDuring","queue","items","priorityQueue","_compareTasks","priority","_binarySearch","sequence","compare","beg","end","mid","cargo","log","dir","memoize","hasher","queues","memoized","l","unmemoized","unmemoize","timesSeries","timesLimit","seq","newargs","nextargs","compose","applyEach","applyEachSeries","forever","constant","values","wrapSync","asyncify","e","then","message","module","exports","define","amd"],"mappings":"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"} \ No newline at end of file
diff --git a/lib/async.js b/lib/async.js
index f3cfb80..9c2b6af 100644
--- a/lib/async.js
+++ b/lib/async.js
@@ -62,6 +62,12 @@
return _toString.call(obj) === '[object Array]';
};
+ // Ported from underscore.js isObject
+ var _isObject = function(obj) {
+ var type = typeof obj;
+ return type === 'function' || type === 'object' && !!obj;
+ };
+
function _isArrayLike(arr) {
return _isArray(arr) || (
// has a positive integer length property
@@ -165,7 +171,6 @@
switch (startIndex) {
case 0: return func.call(this, rest);
case 1: return func.call(this, arguments[0], rest);
- case 2: return func.call(this, arguments[0], arguments[1], rest);
}
// Currently unused but handle cases outside of the switch statement:
// var args = Array(startIndex + 1);
@@ -593,7 +598,7 @@
acc.times = parseInt(t.times, 10) || DEFAULT_TIMES;
acc.interval = parseInt(t.interval, 10) || DEFAULT_INTERVAL;
} else {
- throw new Error('Unsupported argument type for \'times\': ' + typeof(t));
+ throw new Error('Unsupported argument type for \'times\': ' + typeof t);
}
}
@@ -1013,7 +1018,7 @@
function _console_fn(name) {
return _restParam(function (fn, args) {
fn.apply(null, args.concat([_restParam(function (err, args) {
- if (typeof console !== 'undefined') {
+ if (typeof console === 'object') {
if (err) {
if (console.error) {
console.error(err);
@@ -1186,7 +1191,7 @@
return callback(e);
}
// if result is Promise object
- if (typeof result !== 'undefined' && typeof result.then === "function") {
+ if (_isObject(result) && typeof result.then === "function") {
result.then(function(value) {
callback(null, value);
}).catch(function(err) {
@@ -1199,11 +1204,11 @@
};
// Node.js
- if (typeof module !== 'undefined' && module.exports) {
+ if (typeof module === 'object' && module.exports) {
module.exports = async;
}
// AMD / RequireJS
- else if (typeof define !== 'undefined' && define.amd) {
+ else if (typeof define === 'function' && define.amd) {
define([], function () {
return async;
});
diff --git a/package.json b/package.json
index 8c050e1..d0021ae 100644
--- a/package.json
+++ b/package.json
@@ -3,7 +3,7 @@
"description": "Higher-order functions and common patterns for asynchronous code",
"main": "lib/async.js",
"author": "Caolan McMahon",
- "version": "1.3.0",
+ "version": "1.4.0",
"keywords": [
"async",
"callback",
diff --git a/test/test-async.js b/test/test-async.js
index ddfb063..10290ac 100755
--- a/test/test-async.js
+++ b/test/test-async.js
@@ -684,6 +684,19 @@ exports['retry when all attempts succeeds'] = function(test) {
});
};
+exports['retry fails with invalid arguments'] = function(test) {
+ test.throws(function() {
+ async.retry("");
+ });
+ test.throws(function() {
+ async.retry();
+ });
+ test.throws(function() {
+ async.retry(function() {}, 2, function() {});
+ });
+ test.done();
+};
+
exports['retry with interval when all attempts succeeds'] = function(test) {
var times = 3;
var interval = 500;
@@ -2421,6 +2434,19 @@ exports['sortBy inverted'] = function(test){
});
};
+exports['sortBy error'] = function(test){
+ test.expect(1);
+ var error = new Error('asdas');
+ async.sortBy([{a:1},{a:15},{a:6}], function(x, callback){
+ async.setImmediate(function(){
+ callback(error);
+ });
+ }, function(err){
+ test.equal(err, error);
+ test.done();
+ });
+};
+
exports['apply'] = function(test){
test.expect(6);
var fn = function(){
@@ -2899,6 +2925,22 @@ exports['doWhilst callback params'] = function (test) {
);
};
+exports['doWhilst - error'] = function (test) {
+ test.expect(1);
+ var error = new Error('asdas');
+
+ async.doWhilst(
+ function (cb) {
+ cb(error);
+ },
+ function () {},
+ function (err) {
+ test.equal(err, error);
+ test.done();
+ }
+ );
+};
+
exports['during'] = function (test) {
var call_order = [];
@@ -2958,6 +3000,40 @@ exports['doDuring'] = function (test) {
);
};
+exports['doDuring - error test'] = function (test) {
+ test.expect(1);
+ var error = new Error('asdas');
+
+ async.doDuring(
+ function (cb) {
+ cb(error);
+ },
+ function () {},
+ function (err) {
+ test.equal(err, error);
+ test.done();
+ }
+ );
+};
+
+exports['doDuring - error iterator'] = function (test) {
+ test.expect(1);
+ var error = new Error('asdas');
+
+ async.doDuring(
+ function (cb) {
+ cb(null);
+ },
+ function (cb) {
+ cb(error);
+ },
+ function (err) {
+ test.equal(err, error);
+ test.done();
+ }
+ );
+};
+
exports['whilst optional callback'] = function (test) {
var counter = 0;
async.whilst(
@@ -4191,6 +4267,17 @@ exports['asyncify'] = {
});
},
+ 'asyncify null': function (test) {
+ var parse = async.asyncify(function() {
+ return null;
+ });
+ parse("{\"a\":1}", function (err, result) {
+ test.ok(!err);
+ test.ok(result === null);
+ test.done();
+ });
+ },
+
'variable numbers of arguments': function (test) {
async.asyncify(function (x, y, z) {
test.ok(arguments.length === 3);