UNPKG

neo-async

Version:

Neo-Async is a drop-in replacement for Async, it almost fully covers its functionality and runs faster

1,893 lines (1,862 loc) 235 kB
(function(global, factory) { /*jshint -W030 */ 'use strict'; typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : global.async ? factory((global.neo_async = global.neo_async || {})) : factory((global.async = global.async || {})); })(this, function(exports) { 'use strict'; var noop = function noop() {}; var throwError = function throwError() { throw new Error('Callback was already called.'); }; var DEFAULT_TIMES = 5; var DEFAULT_INTERVAL = 0; var obj = 'object'; var func = 'function'; var isArray = Array.isArray; var nativeKeys = Object.keys; var nativePush = Array.prototype.push; var iteratorSymbol = typeof Symbol === func && Symbol.iterator; var nextTick, asyncNextTick, asyncSetImmediate; createImmediate(); /** * @memberof async * @namespace each * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(); * }, num * 10); * }; * async.each(array, iterator, function(err, res) { * console.log(res); // undefined * console.log(order); // [1, 2, 3] * }); * * @example * * // array with index * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(); * }, num * 10); * }; * async.each(array, iterator, function(err, res) { * console.log(res); // undefined * console.log(order); // [[1, 0], [2, 2], [3, 1]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(); * }, num * 10); * }; * async.each(object, iterator, function(err, res) { * console.log(res); // undefined * console.log(order); // [1, 2, 3] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(); * }, num * 10); * }; * async.each(object, iterator, function(err, res) { * console.log(res); // undefined * console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']] * }); * * @example * * // break * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num !== 2); * }, num * 10); * }; * async.each(array, iterator, function(err, res) { * console.log(res); // undefined * console.log(order); // [1, 2] * }); * */ var each = createEach(arrayEach, baseEach, symbolEach); /** * @memberof async * @namespace map * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num); * }, num * 10); * }; * async.map(array, iterator, function(err, res) { * console.log(res); // [1, 3, 2]; * console.log(order); // [1, 2, 3] * }); * * @example * * // array with index * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num); * }, num * 10); * }; * async.map(array, iterator, function(err, res) { * console.log(res); // [1, 3, 2] * console.log(order); // [[1, 0], [2, 2], [3, 1]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num); * }, num * 10); * }; * async.map(object, iterator, function(err, res) { * console.log(res); // [1, 3, 2] * console.log(order); // [1, 2, 3] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num); * }, num * 10); * }; * async.map(object, iterator, function(err, res) { * console.log(res); // [1, 3, 2] * console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']] * }); * */ var map = createMap(arrayEachIndex, baseEachIndex, symbolEachIndex, true); /** * @memberof async * @namespace mapValues * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num); * }, num * 10); * }; * async.mapValues(array, iterator, function(err, res) { * console.log(res); // { '0': 1, '1': 3, '2': 2 } * console.log(order); // [1, 2, 3] * }); * * @example * * // array with index * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num); * }, num * 10); * }; * async.mapValues(array, iterator, function(err, res) { * console.log(res); // { '0': 1, '1': 3, '2': 2 } * console.log(order); // [[1, 0], [2, 2], [3, 1]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num); * }, num * 10); * }; * async.mapValues(object, iterator, function(err, res) { * console.log(res); // { a: 1, b: 3, c: 2 } * console.log(order); // [1, 2, 3] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num); * }, num * 10); * }; * async.mapValues(object, iterator, function(err, res) { * console.log(res); // { a: 1, b: 3, c: 2 } * console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']] * }); * */ var mapValues = createMap(arrayEachIndex, baseEachKey, symbolEachKey, false); /** * @memberof async * @namespace filter * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.filter(array, iterator, function(err, res) { * console.log(res); // [1, 3]; * console.log(order); // [1, 2, 3] * }); * * @example * * // array with index * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.filter(array, iterator, function(err, res) { * console.log(res); // [1, 3]; * console.log(order); // [[1, 0], [2, 2], [3, 1]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.filter(object, iterator, function(err, res) { * console.log(res); // [1, 3]; * console.log(order); // [1, 2, 3] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.filter(object, iterator, function(err, res) { * console.log(res); // [1, 3]; * console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']] * }); * */ var filter = createFilter(arrayEachIndexValue, baseEachIndexValue, symbolEachIndexValue, true); /** * @memberof async * @namespace filterSeries * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.filterSeries(array, iterator, function(err, res) { * console.log(res); // [1, 3]; * console.log(order); // [1, 3, 2] * }); * * @example * * // array with index * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.filterSeries(array, iterator, function(err, res) { * console.log(res); // [1, 3] * console.log(order); // [[1, 0], [3, 1], [2, 2]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.filterSeries(object, iterator, function(err, res) { * console.log(res); // [1, 3] * console.log(order); // [1, 3, 2] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.filterSeries(object, iterator, function(err, res) { * console.log(res); // [1, 3] * console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c']] * }); * */ var filterSeries = createFilterSeries(true); /** * @memberof async * @namespace filterLimit * @param {Array|Object} collection * @param {number} limit - limit >= 1 * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 5, 3, 4, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.filterLimit(array, 2, iterator, function(err, res) { * console.log(res); // [1, 5, 3] * console.log(order); // [1, 3, 5, 2, 4] * }); * * @example * * // array with index * var order = []; * var array = [1, 5, 3, 4, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.filterLimit(array, 2, iterator, function(err, res) { * console.log(res); // [1, 5, 3] * console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.filterLimit(object, 2, iterator, function(err, res) { * console.log(res); // [1, 5, 3] * console.log(order); // [1, 3, 5, 2, 4] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.filterLimit(object, 2, iterator, function(err, res) { * console.log(res); // [1, 5, 3] * console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']] * }); * */ var filterLimit = createFilterLimit(true); /** * @memberof async * @namespace reject * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.reject(array, iterator, function(err, res) { * console.log(res); // [2]; * console.log(order); // [1, 2, 3] * }); * * @example * * // array with index * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.reject(array, iterator, function(err, res) { * console.log(res); // [2]; * console.log(order); // [[1, 0], [2, 2], [3, 1]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.reject(object, iterator, function(err, res) { * console.log(res); // [2]; * console.log(order); // [1, 2, 3] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.reject(object, iterator, function(err, res) { * console.log(res); // [2]; * console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']] * }); * */ var reject = createFilter(arrayEachIndexValue, baseEachIndexValue, symbolEachIndexValue, false); /** * @memberof async * @namespace rejectSeries * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.rejectSeries(array, iterator, function(err, res) { * console.log(res); // [2]; * console.log(order); // [1, 3, 2] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.rejectSeries(object, iterator, function(err, res) { * console.log(res); // [2]; * console.log(order); // [1, 3, 2] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.rejectSeries(object, iterator, function(err, res) { * console.log(res); // [2]; * console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c']] * }); * */ var rejectSeries = createFilterSeries(false); /** * @memberof async * @namespace rejectLimit * @param {Array|Object} collection * @param {number} limit - limit >= 1 * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 5, 3, 4, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.rejectLimit(array, 2, iterator, function(err, res) { * console.log(res); // [4, 2] * console.log(order); // [1, 3, 5, 2, 4] * }); * * @example * * // array with index * var order = []; * var array = [1, 5, 3, 4, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.rejectLimit(array, 2, iterator, function(err, res) { * console.log(res); // [4, 2] * console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.rejectLimit(object, 2, iterator, function(err, res) { * console.log(res); // [4, 2] * console.log(order); // [1, 3, 5, 2, 4] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.rejectLimit(object, 2, iterator, function(err, res) { * console.log(res); // [4, 2] * console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']] * }); * */ var rejectLimit = createFilterLimit(false); /** * @memberof async * @namespace detect * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.detect(array, iterator, function(err, res) { * console.log(res); // 1 * console.log(order); // [1] * }); * * @example * * // array with index * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.detect(array, iterator, function(err, res) { * console.log(res); // 1 * console.log(order); // [[1, 0]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.detect(object, iterator, function(err, res) { * console.log(res); // 1 * console.log(order); // [1] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.detect(object, iterator, function(err, res) { * console.log(res); // 1 * console.log(order); // [[1, 'a']] * }); * */ var detect = createDetect(arrayEachValue, baseEachValue, symbolEachValue, true); /** * @memberof async * @namespace detectSeries * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.detectSeries(array, iterator, function(err, res) { * console.log(res); // 1 * console.log(order); // [1] * }); * * @example * * // array with index * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.detectSeries(array, iterator, function(err, res) { * console.log(res); // 1 * console.log(order); // [[1, 0]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.detectSeries(object, iterator, function(err, res) { * console.log(res); // 1 * console.log(order); // [1] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.detectSeries(object, iterator, function(err, res) { * console.log(res); // 1 * console.log(order); // [[1, 'a']] * }); * */ var detectSeries = createDetectSeries(true); /** * @memberof async * @namespace detectLimit * @param {Array|Object} collection * @param {number} limit - limit >= 1 * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 5, 3, 4, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.detectLimit(array, 2, iterator, function(err, res) { * console.log(res); // 1 * console.log(order); // [1] * }); * * @example * * // array with index * var order = []; * var array = [1, 5, 3, 4, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.detectLimit(array, 2, iterator, function(err, res) { * console.log(res); // 1 * console.log(order); // [[1, 0]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.detectLimit(object, 2, iterator, function(err, res) { * console.log(res); // 1 * console.log(order); // [1] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.detectLimit(object, 2, iterator, function(err, res) { * console.log(res); // 1 * console.log(order); // [[1, 'a']] * }); * */ var detectLimit = createDetectLimit(true); /** * @memberof async * @namespace every * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.every(array, iterator, function(err, res) { * console.log(res); // false * console.log(order); // [1, 2] * }); * * @example * * // array with index * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.every(array, iterator, function(err, res) { * console.log(res); // false * console.log(order); // [[1, 0], [2, 2]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.every(object, iterator, function(err, res) { * console.log(res); // false * console.log(order); // [1, 2] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.every(object, iterator, function(err, res) { * console.log(res); // false * console.log(order); // [[1, 'a'], [2, 'c']] * }); * */ var every = createEvery(arrayEachValue, baseEachValue, symbolEachValue); /** * @memberof async * @namespace everySeries * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.everySeries(array, iterator, function(err, res) { * console.log(res); // false * console.log(order); // [1, 3, 2] * }); * * @example * * // array with index * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.everySeries(array, iterator, function(err, res) { * console.log(res); // false * console.log(order); // [[1, 0], [3, 1], [2, 2]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.everySeries(object, iterator, function(err, res) { * console.log(res); // false * console.log(order); // [1, 3, 2] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.everySeries(object, iterator, function(err, res) { * console.log(res); // false * console.log(order); // [[1, 'a'], [3, 'b'] [2, 'c']] * }); * */ var everySeries = createEverySeries(); /** * @memberof async * @namespace everyLimit * @param {Array|Object} collection * @param {number} limit - limit >= 1 * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 5, 3, 4, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.everyLimit(array, 2, iterator, function(err, res) { * console.log(res); // false * console.log(order); // [1, 3, 5, 2] * }); * * @example * * // array with index * var order = []; * var array = [1, 5, 3, 4, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.everyLimit(array, 2, iterator, function(err, res) { * console.log(res); // false * console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.everyLimit(object, 2, iterator, function(err, res) { * console.log(res); // false * console.log(order); // [1, 3, 5, 2] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.everyLimit(object, 2, iterator, function(err, res) { * console.log(res); // false * console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e']] * }); * */ var everyLimit = createEveryLimit(); /** * @memberof async * @namespace pick * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2, 4]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.pick(array, iterator, function(err, res) { * console.log(res); // { '0': 1, '1': 3 } * console.log(order); // [1, 2, 3, 4] * }); * * @example * * // array with index * var order = []; * var array = [1, 3, 2, 4]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.pick(array, iterator, function(err, res) { * console.log(res); // { '0': 1, '1': 3 } * console.log(order); // [[0, 1], [2, 2], [3, 1], [4, 3]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2, d: 4 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.pick(object, iterator, function(err, res) { * console.log(res); // { a: 1, b: 3 } * console.log(order); // [1, 2, 3, 4] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2, d: 4 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.pick(object, iterator, function(err, res) { * console.log(res); // { a: 1, b: 3 } * console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b'], [4, 'd']] * }); * */ var pick = createPick(arrayEachIndexValue, baseEachKeyValue, symbolEachKeyValue, true); /** * @memberof async * @namespace pickSeries * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2, 4]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.pickSeries(array, iterator, function(err, res) { * console.log(res); // { '0': 1, '1': 3 } * console.log(order); // [1, 3, 2, 4] * }); * * @example * * // array with index * var order = []; * var array = [1, 3, 2, 4]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.pickSeries(array, iterator, function(err, res) { * console.log(res); // { '0': 1, '1': 3 } * console.log(order); // [[0, 1], [3, 1], [2, 2], [4, 3]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2, d: 4 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.pickSeries(object, iterator, function(err, res) { * console.log(res); // { a: 1, b: 3 } * console.log(order); // [1, 3, 2, 4] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2, d: 4 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.pickSeries(object, iterator, function(err, res) { * console.log(res); // { a: 1, b: 3 } * console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c'], [4, 'd']] * }); * */ var pickSeries = createPickSeries(true); /** * @memberof async * @namespace pickLimit * @param {Array|Object} collection * @param {number} limit - limit >= 1 * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 5, 3, 4, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.pickLimit(array, 2, iterator, function(err, res) { * console.log(res); // { '0': 1, '1': 5, '2': 3 } * console.log(order); // [1, 3, 5, 2, 4] * }); * * @example * * // array with index * var order = []; * var array = [1, 5, 3, 4, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.pickLimit(array, 2, iterator, function(err, res) { * console.log(res); // { '0': 1, '1': 5, '2': 3 } * console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.pickLimit(object, 2, iterator, function(err, res) { * console.log(res); // { a: 1, b: 5, c: 3 } * console.log(order); // [1, 3, 5, 2, 4] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.pickLimit(object, 2, iterator, function(err, res) { * console.log(res); // { a: 1, b: 5, c: 3 } * console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']] * }); * */ var pickLimit = createPickLimit(true); /** * @memberof async * @namespace omit * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2, 4]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.omit(array, iterator, function(err, res) { * console.log(res); // { '2': 2, '3': 4 } * console.log(order); // [1, 2, 3, 4] * }); * * @example * * // array with index * var order = []; * var array = [1, 3, 2, 4]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.omit(array, iterator, function(err, res) { * console.log(res); // { '2': 2, '3': 4 } * console.log(order); // [[0, 1], [2, 2], [3, 1], [4, 3]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2, d: 4 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.omit(object, iterator, function(err, res) { * console.log(res); // { c: 2, d: 4 } * console.log(order); // [1, 2, 3, 4] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2, d: 4 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.omit(object, iterator, function(err, res) { * console.log(res); // { c: 2, d: 4 } * console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b'], [4, 'd']] * }); * */ var omit = createPick(arrayEachIndexValue, baseEachKeyValue, symbolEachKeyValue, false); /** * @memberof async * @namespace omitSeries * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2, 4]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.omitSeries(array, iterator, function(err, res) { * console.log(res); // { '2': 2, '3': 4 } * console.log(order); // [1, 3, 2, 4] * }); * * @example * * // array with index * var order = []; * var array = [1, 3, 2, 4]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.omitSeries(array, iterator, function(err, res) { * console.log(res); // { '2': 2, '3': 4 } * console.log(order); // [[0, 1], [3, 1], [2, 2], [4, 3]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2, d: 4 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.omitSeries(object, iterator, function(err, res) { * console.log(res); // { c: 2, d: 4 } * console.log(order); // [1, 3, 2, 4] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2, d: 4 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.omitSeries(object, iterator, function(err, res) { * console.log(res); // { c: 2, d: 4 } * console.log(order); // [[1, 'a'], [3, 'b'], [2, 'c'], [4, 'd']] * }); * */ var omitSeries = createPickSeries(false); /** * @memberof async * @namespace omitLimit * @param {Array|Object} collection * @param {number} limit - limit >= 1 * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 5, 3, 4, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.omitLimit(array, 2, iterator, function(err, res) { * console.log(res); // { '3': 4, '4': 2 } * console.log(order); // [1, 3, 5, 2, 4] * }); * * @example * * // array with index * var order = []; * var array = [1, 5, 3, 4, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num % 2); * }, num * 10); * }; * async.omitLimit(array, 2, iterator, function(err, res) { * console.log(res); // { '3': 4, '4': 2 } * console.log(order); // [[1, 0], [3, 2], [5, 1], [2, 4], [4, 3]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num % 2); * }, num * 10); * }; * async.omitLimit(object, 2, iterator, function(err, res) { * console.log(res); // { d: 4, e: 2 } * console.log(order); // [1, 3, 5, 2, 4] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 5, c: 3, d: 4, e: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num % 2); * }, num * 10); * }; * async.omitLimit(object, 2, iterator, function(err, res) { * console.log(res); // { d: 4, e: 2 } * console.log(order); // [[1, 'a'], [3, 'c'], [5, 'b'], [2, 'e'], [4, 'd']] * }); * */ var omitLimit = createPickLimit(false); /** * @memberof async * @namespace transform * @param {Array|Object} collection * @param {Array|Object|Function} [accumulator] * @param {Function} [iterator] * @param {Function} [callback] * @example * * // array * var order = []; * var collection = [1, 3, 2, 4]; * var iterator = function(result, num, done) { * setTimeout(function() { * order.push(num); * result.push(num) * done(); * }, num * 10); * }; * async.transform(collection, iterator, function(err, res) { * console.log(res); // [1, 2, 3, 4] * console.log(order); // [1, 2, 3, 4] * }); * * @example * * // array with index and accumulator * var order = []; * var collection = [1, 3, 2, 4]; * var iterator = function(result, num, index, done) { * setTimeout(function() { * order.push([num, index]); * result[index] = num; * done(); * }, num * 10); * }; * async.transform(collection, {}, iterator, function(err, res) { * console.log(res); // { '0': 1, '1': 3, '2': 2, '3': 4 } * console.log(order); // [[1, 0], [2, 2], [3, 1], [4, 3]] * }); * * @example * * // object with accumulator * var order = []; * var object = { a: 1, b: 3, c: 2, d: 4 }; * var iterator = function(result, num, done) { * setTimeout(function() { * order.push(num); * result.push(num); * done(); * }, num * 10); * }; * async.transform(collection, [], iterator, function(err, res) { * console.log(res); // [1, 2, 3, 4] * console.log(order); // [1, 2, 3, 4] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2, d: 4 }; * var iterator = function(result, num, key, done) { * setTimeout(function() { * order.push([num, key]); * result[key] = num; * done(); * }, num * 10); * }; * async.transform(collection, iterator, function(err, res) { * console.log(res); // { a: 1, b: 3, c: 2, d: 4 } * console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b'], [4, 'd']] * }); * */ var transform = createTransform(arrayEachResult, baseEachResult, symbolEachResult); /** * @memberof async * @namespace sortBy * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num); * }, num * 10); * }; * async.sortBy(array, iterator, function(err, res) { * console.log(res); // [1, 2, 3]; * console.log(order); // [1, 2, 3] * }); * * @example * * // array with index * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, num); * }, num * 10); * }; * async.sortBy(array, iterator, function(err, res) { * console.log(res); // [1, 2, 3] * console.log(order); // [[1, 0], [2, 2], [3, 1]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, num); * }, num * 10); * }; * async.sortBy(object, iterator, function(err, res) { * console.log(res); // [1, 2, 3] * console.log(order); // [1, 2, 3] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, num); * }, num * 10); * }; * async.sortBy(object, iterator, function(err, res) { * console.log(res); // [1, 2, 3] * console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']] * }); * */ var sortBy = createSortBy(arrayEachIndexValue, baseEachIndexValue, symbolEachIndexValue); /** * @memberof async * @namespace concat * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, [num]); * }, num * 10); * }; * async.concat(array, iterator, function(err, res) { * console.log(res); // [1, 2, 3]; * console.log(order); // [1, 2, 3] * }); * * @example * * // array with index * var order = []; * var array = [1, 3, 2]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, [num]); * }, num * 10); * }; * async.concat(array, iterator, function(err, res) { * console.log(res); // [1, 2, 3] * console.log(order); // [[1, 0], [2, 2], [3, 1]] * }); * * @example * * // object * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, [num]); * }, num * 10); * }; * async.concat(object, iterator, function(err, res) { * console.log(res); // [1, 2, 3] * console.log(order); // [1, 2, 3] * }); * * @example * * // object with key * var order = []; * var object = { a: 1, b: 3, c: 2 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, [num]); * }, num * 10); * }; * async.concat(object, iterator, function(err, res) { * console.log(res); // [1, 2, 3] * console.log(order); // [[1, 'a'], [2, 'c'], [3, 'b']] * }); * */ var concat = createConcat(arrayEachIndex, baseEachIndex, symbolEachIndex); /** * @memberof async * @namespace groupBy * @param {Array|Object} collection * @param {Function} iterator * @param {Function} callback * @example * * // array * var order = []; * var array = [4.2, 6.4, 6.1]; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, Math.floor(num)); * }, num * 10); * }; * async.groupBy(array, iterator, function(err, res) { * console.log(res); // { '4': [4.2], '6': [6.1, 6.4] } * console.log(order); // [4.2, 6.1, 6.4] * }); * * @example * * // array with index * var order = []; * var array = [4.2, 6.4, 6.1]; * var iterator = function(num, index, done) { * setTimeout(function() { * order.push([num, index]); * done(null, Math.floor(num)); * }, num * 10); * }; * async.groupBy(array, iterator, function(err, res) { * console.log(res); // { '4': [4.2], '6': [6.1, 6.4] } * console.log(order); // [[4.2, 0], [6.1, 2], [6.4, 1]] * }); * * @example * * // object * var order = []; * var object = { a: 4.2, b: 6.4, c: 6.1 }; * var iterator = function(num, done) { * setTimeout(function() { * order.push(num); * done(null, Math.floor(num)); * }, num * 10); * }; * async.groupBy(object, iterator, function(err, res) { * console.log(res); // { '4': [4.2], '6': [6.1, 6.4] } * console.log(order); // [4.2, 6.1, 6.4] * }); * * @example * * // object with key * var order = []; * var object = { a: 4.2, b: 6.4, c: 6.1 }; * var iterator = function(num, key, done) { * setTimeout(function() { * order.push([num, key]); * done(null, Math.floor(num)); * }, num * 10); * }; * async.groupBy(object, iterator, function(err, res) { * console.log(res); // { '4': [4.2], '6': [6.1, 6.4] } * console.log(order); // [[4.2, 'a'], [6.1, 'c'], [6.4, 'b']] * }); * */ var groupBy = createGroupBy(arrayEachValue, baseEachValue, symbolEachValue); /** * @memberof async * @namespace parallel * @param {Array|Object} tasks - functions * @param {Function} callback * @example * * var order = []; * var tasks = [ * function(done) { * setTimeout(function() { * order.push(1); * done(null, 1); * }, 10); * }, * function(done) { * setTimeout(function() { * order.push(2); * done(null, 2); * }, 30); * }, * function(done) { * setTimeout(function() { * order.push(3); * done(null, 3);