因为工作需要,可能我离前端走远了,偏node方向了。所以异步编程的需求很多,于是乎,不得不带着学习async了。

我有个习惯,用别人的东西之前,喜欢稍微搞明白点,so就带着看看其源码。

github: https://github.com/caolan/async

文档:http://caolan.github.io/async/

 

里面提供的工具方法,控制流程方法还是很多的。所以需要哪些方法,就看相应的源码。

下面是其全部源码。

(function (global, factory) {typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :typeof define === 'function' && define.amd ? define(['exports'], factory) :(factory((global.async = global.async || {})));
}(this, (function (exports) { 'use strict';// 重写数组中的slice方法
function slice(arrayLike, start) {    // arrayLike: 类数组对象  start: 开始位置start = start|0;var newLen = Math.max(arrayLike.length - start, 0);    // 长度var newArr = Array(newLen);    // 创建一个长度为newLen的数组for(var idx = 0; idx < newLen; idx++)  {newArr[idx] = arrayLike[start + idx];};return newArr;    // 返回数组
}var initialParams = function (fn) {return function (/*...args, callback*/) {var args = slice(arguments);var callback = args.pop();fn.call(this, args, callback);};
};/*** Checks if `value` is the* [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)* of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)** @static* @memberOf _* @since 0.1.0* @category Lang* @param {*} value The value to check.* @returns {boolean} Returns `true` if `value` is an object, else `false`.* @example** _.isObject({});* // => true** _.isObject([1, 2, 3]);* // => true** _.isObject(_.noop);* // => true** _.isObject(null);* // => false*/
function isObject(value) {var type = typeof value;return value != null && (type == 'object' || type == 'function');
}var hasSetImmediate = typeof setImmediate === 'function' && setImmediate;
var hasNextTick = typeof process === 'object' && typeof process.nextTick === 'function';function fallback(fn) {setTimeout(fn, 0);
}function wrap(defer) {return function (fn/*, ...args*/) {var args = slice(arguments, 1);defer(function () {fn.apply(null, args);});};
}var _defer;if (hasSetImmediate) {_defer = setImmediate;
} else if (hasNextTick) {_defer = process.nextTick;
} else {_defer = fallback;
}var setImmediate$1 = wrap(_defer);/*** Take a sync function and make it async, passing its return value to a* callback. This is useful for plugging sync functions into a waterfall,* series, or other async functions. Any arguments passed to the generated* function will be passed to the wrapped function (except for the final* callback argument). Errors thrown will be passed to the callback.** If the function passed to `asyncify` returns a Promise, that promises's* resolved/rejected state will be used to call the callback, rather than simply* the synchronous return value.** This also means you can asyncify ES2017 `async` functions.** @name asyncify* @static* @memberOf module:Utils* @method* @alias wrapSync* @category Util* @param {Function} func - The synchronous function, or Promise-returning* function to convert to an {@link AsyncFunction}.* @returns {AsyncFunction} An asynchronous wrapper of the `func`. To be* invoked with `(args..., callback)`.* @example** // passing a regular synchronous function* async.waterfall([*     async.apply(fs.readFile, filename, "utf8"),*     async.asyncify(JSON.parse),*     function (data, next) {*         // data is the result of parsing the text.*         // If there was a parsing error, it would have been caught.*     }* ], callback);** // passing a function returning a promise* async.waterfall([*     async.apply(fs.readFile, filename, "utf8"),*     async.asyncify(function (contents) {*         return db.model.create(contents);*     }),*     function (model, next) {*         // `model` is the instantiated model object.*         // If there was an error, this function would be skipped.*     }* ], callback);** // es2017 example, though `asyncify` is not needed if your JS environment* // supports async functions out of the box* var q = async.queue(async.asyncify(async function(file) {*     var intermediateStep = await processFile(file);*     return await somePromise(intermediateStep)* }));** q.push(files);*/
function asyncify(func) {return initialParams(function (args, callback) {var result;try {result = func.apply(this, args);} catch (e) {return callback(e);}// if result is Promise objectif (isObject(result) && typeof result.then === 'function') {result.then(function(value) {invokeCallback(callback, null, value);}, function(err) {invokeCallback(callback, err.message ? err : new Error(err));});} else {callback(null, result);}});
}function invokeCallback(callback, error, value) {try {callback(error, value);} catch (e) {setImmediate$1(rethrow, e);}
}function rethrow(error) {throw error;
}var supportsSymbol = typeof Symbol === 'function';// 是否是异步
function isAsync(fn) {return supportsSymbol && fn[Symbol.toStringTag] === 'AsyncFunction';
}// 包装成异步
function wrapAsync(asyncFn) {return isAsync(asyncFn) ? asyncify(asyncFn) : asyncFn;
}function applyEach$1(eachfn) {return function(fns/*, ...args*/) {var args = slice(arguments, 1);var go = initialParams(function(args, callback) {var that = this;return eachfn(fns, function (fn, cb) {wrapAsync(fn).apply(that, args.concat(cb));}, callback);});if (args.length) {return go.apply(this, args);}else {return go;}};
}/** Detect free variable `global` from Node.js. */
var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;/** Detect free variable `self`. */
var freeSelf = typeof self == 'object' && self && self.Object === Object && self;/** Used as a reference to the global object. */
var root = freeGlobal || freeSelf || Function('return this')();/** Built-in value references. */
var Symbol$1 = root.Symbol;/** Used for built-in method references. */
var objectProto = Object.prototype;/** Used to check objects for own properties. */
var hasOwnProperty = objectProto.hasOwnProperty;/*** Used to resolve the* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)* of values.*/
var nativeObjectToString = objectProto.toString;/** Built-in value references. */
var symToStringTag$1 = Symbol$1 ? Symbol$1.toStringTag : undefined;/*** A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.** @private* @param {*} value The value to query.* @returns {string} Returns the raw `toStringTag`.*/
function getRawTag(value) {var isOwn = hasOwnProperty.call(value, symToStringTag$1),tag = value[symToStringTag$1];try {value[symToStringTag$1] = undefined;var unmasked = true;} catch (e) {}var result = nativeObjectToString.call(value);if (unmasked) {if (isOwn) {value[symToStringTag$1] = tag;} else {delete value[symToStringTag$1];}}return result;
}/** Used for built-in method references. */
var objectProto$1 = Object.prototype;/*** Used to resolve the* [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)* of values.*/
var nativeObjectToString$1 = objectProto$1.toString;/*** Converts `value` to a string using `Object.prototype.toString`.** @private* @param {*} value The value to convert.* @returns {string} Returns the converted string.*/
function objectToString(value) {return nativeObjectToString$1.call(value);
}/** `Object#toString` result references. */
var nullTag = '[object Null]';
var undefinedTag = '[object Undefined]';/** Built-in value references. */
var symToStringTag = Symbol$1 ? Symbol$1.toStringTag : undefined;/*** The base implementation of `getTag` without fallbacks for buggy environments.** @private* @param {*} value The value to query.* @returns {string} Returns the `toStringTag`.*/
function baseGetTag(value) {if (value == null) {return value === undefined ? undefinedTag : nullTag;}value = Object(value);return (symToStringTag && symToStringTag in value)? getRawTag(value): objectToString(value);
}/** `Object#toString` result references. */
var asyncTag = '[object AsyncFunction]';
var funcTag = '[object Function]';
var genTag = '[object GeneratorFunction]';
var proxyTag = '[object Proxy]';/*** Checks if `value` is classified as a `Function` object.** @static* @memberOf _* @since 0.1.0* @category Lang* @param {*} value The value to check.* @returns {boolean} Returns `true` if `value` is a function, else `false`.* @example** _.isFunction(_);* // => true** _.isFunction(/abc/);* // => false*/
function isFunction(value) {if (!isObject(value)) {return false;}// The use of `Object#toString` avoids issues with the `typeof` operator// in Safari 9 which returns 'object' for typed arrays and other constructors.var tag = baseGetTag(value);return tag == funcTag || tag == genTag || tag == asyncTag || tag == proxyTag;
}/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER = 9007199254740991;/*** Checks if `value` is a valid array-like length.** **Note:** This method is loosely based on* [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength).** @static* @memberOf _* @since 4.0.0* @category Lang* @param {*} value The value to check.* @returns {boolean} Returns `true` if `value` is a valid length, else `false`.* @example** _.isLength(3);* // => true** _.isLength(Number.MIN_VALUE);* // => false** _.isLength(Infinity);* // => false** _.isLength('3');* // => false*/
function isLength(value) {return typeof value == 'number' &&value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;
}/*** Checks if `value` is array-like. A value is considered array-like if it's* not a function and has a `value.length` that's an integer greater than or* equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.** @static* @memberOf _* @since 4.0.0* @category Lang* @param {*} value The value to check.* @returns {boolean} Returns `true` if `value` is array-like, else `false`.* @example** _.isArrayLike([1, 2, 3]);* // => true** _.isArrayLike(document.body.children);* // => true** _.isArrayLike('abc');* // => true** _.isArrayLike(_.noop);* // => false*/
function isArrayLike(value) {return value != null && isLength(value.length) && !isFunction(value);
}// A temporary value used to identify if the loop should be broken.
// See #1064, #1293
var breakLoop = {};/*** This method returns `undefined`.** @static* @memberOf _* @since 2.3.0* @category Util* @example** _.times(2, _.noop);* // => [undefined, undefined]*/
// 空函数
function noop() {// No operation performed.
}// 一次(偏函数)
function once(fn) {    // fn: waterfall的第二个参数(回调函数)return function () {if (fn === null) return;var callFn = fn;fn = null;    // 把上级函数作用域中的fn置空callFn.apply(this, arguments);    // 调用回调函数
    };
}var iteratorSymbol = typeof Symbol === 'function' && Symbol.iterator;var getIterator = function (coll) {return iteratorSymbol && coll[iteratorSymbol] && coll[iteratorSymbol]();
};/*** The base implementation of `_.times` without support for iteratee shorthands* or max array length checks.** @private* @param {number} n The number of times to invoke `iteratee`.* @param {Function} iteratee The function invoked per iteration.* @returns {Array} Returns the array of results.*/
function baseTimes(n, iteratee) {var index = -1,result = Array(n);while (++index < n) {result[index] = iteratee(index);}return result;
}/*** Checks if `value` is object-like. A value is object-like if it's not `null`* and has a `typeof` result of "object".** @static* @memberOf _* @since 4.0.0* @category Lang* @param {*} value The value to check.* @returns {boolean} Returns `true` if `value` is object-like, else `false`.* @example** _.isObjectLike({});* // => true** _.isObjectLike([1, 2, 3]);* // => true** _.isObjectLike(_.noop);* // => false** _.isObjectLike(null);* // => false*/
function isObjectLike(value) {return value != null && typeof value == 'object';
}/** `Object#toString` result references. */
var argsTag = '[object Arguments]';/*** The base implementation of `_.isArguments`.** @private* @param {*} value The value to check.* @returns {boolean} Returns `true` if `value` is an `arguments` object,*/
function baseIsArguments(value) {return isObjectLike(value) && baseGetTag(value) == argsTag;
}/** Used for built-in method references. */
var objectProto$3 = Object.prototype;/** Used to check objects for own properties. */
var hasOwnProperty$2 = objectProto$3.hasOwnProperty;/** Built-in value references. */
var propertyIsEnumerable = objectProto$3.propertyIsEnumerable;/*** Checks if `value` is likely an `arguments` object.** @static* @memberOf _* @since 0.1.0* @category Lang* @param {*} value The value to check.* @returns {boolean} Returns `true` if `value` is an `arguments` object,*  else `false`.* @example** _.isArguments(function() { return arguments; }());* // => true** _.isArguments([1, 2, 3]);* // => false*/
var isArguments = baseIsArguments(function() { return arguments; }()) ? baseIsArguments : function(value) {return isObjectLike(value) && hasOwnProperty$2.call(value, 'callee') &&!propertyIsEnumerable.call(value, 'callee');
};/*** Checks if `value` is classified as an `Array` object.** @static* @memberOf _* @since 0.1.0* @category Lang* @param {*} value The value to check.* @returns {boolean} Returns `true` if `value` is an array, else `false`.* @example** _.isArray([1, 2, 3]);* // => true** _.isArray(document.body.children);* // => false** _.isArray('abc');* // => false** _.isArray(_.noop);* // => false*/
var isArray = Array.isArray;    // 把数组的isArray赋给isArray变量/*** This method returns `false`.** @static* @memberOf _* @since 4.13.0* @category Util* @returns {boolean} Returns `false`.* @example** _.times(2, _.stubFalse);* // => [false, false]*/
function stubFalse() {return false;
}/** Detect free variable `exports`. */
var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;/** Detect free variable `module`. */
var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;/** Detect the popular CommonJS extension `module.exports`. */
var moduleExports = freeModule && freeModule.exports === freeExports;/** Built-in value references. */
var Buffer = moduleExports ? root.Buffer : undefined;/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined;/*** Checks if `value` is a buffer.** @static* @memberOf _* @since 4.3.0* @category Lang* @param {*} value The value to check.* @returns {boolean} Returns `true` if `value` is a buffer, else `false`.* @example** _.isBuffer(new Buffer(2));* // => true** _.isBuffer(new Uint8Array(2));* // => false*/
var isBuffer = nativeIsBuffer || stubFalse;/** Used as references for various `Number` constants. */
var MAX_SAFE_INTEGER$1 = 9007199254740991;/** Used to detect unsigned integer values. */
var reIsUint = /^(?:0|[1-9]\d*)$/;/*** Checks if `value` is a valid array-like index.** @private* @param {*} value The value to check.* @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index.* @returns {boolean} Returns `true` if `value` is a valid index, else `false`.*/
function isIndex(value, length) {length = length == null ? MAX_SAFE_INTEGER$1 : length;return !!length &&(typeof value == 'number' || reIsUint.test(value)) &&(value > -1 && value % 1 == 0 && value < length);
}/** `Object#toString` result references. */
var argsTag$1 = '[object Arguments]';
var arrayTag = '[object Array]';
var boolTag = '[object Boolean]';
var dateTag = '[object Date]';
var errorTag = '[object Error]';
var funcTag$1 = '[object Function]';
var mapTag = '[object Map]';
var numberTag = '[object Number]';
var objectTag = '[object Object]';
var regexpTag = '[object RegExp]';
var setTag = '[object Set]';
var stringTag = '[object String]';
var weakMapTag = '[object WeakMap]';var arrayBufferTag = '[object ArrayBuffer]';
var dataViewTag = '[object DataView]';
var float32Tag = '[object Float32Array]';
var float64Tag = '[object Float64Array]';
var int8Tag = '[object Int8Array]';
var int16Tag = '[object Int16Array]';
var int32Tag = '[object Int32Array]';
var uint8Tag = '[object Uint8Array]';
var uint8ClampedTag = '[object Uint8ClampedArray]';
var uint16Tag = '[object Uint16Array]';
var uint32Tag = '[object Uint32Array]';/** Used to identify `toStringTag` values of typed arrays. */
var typedArrayTags = {};
typedArrayTags[float32Tag] = typedArrayTags[float64Tag] =
typedArrayTags[int8Tag] = typedArrayTags[int16Tag] =
typedArrayTags[int32Tag] = typedArrayTags[uint8Tag] =
typedArrayTags[uint8ClampedTag] = typedArrayTags[uint16Tag] =
typedArrayTags[uint32Tag] = true;
typedArrayTags[argsTag$1] = typedArrayTags[arrayTag] =
typedArrayTags[arrayBufferTag] = typedArrayTags[boolTag] =
typedArrayTags[dataViewTag] = typedArrayTags[dateTag] =
typedArrayTags[errorTag] = typedArrayTags[funcTag$1] =
typedArrayTags[mapTag] = typedArrayTags[numberTag] =
typedArrayTags[objectTag] = typedArrayTags[regexpTag] =
typedArrayTags[setTag] = typedArrayTags[stringTag] =
typedArrayTags[weakMapTag] = false;/*** The base implementation of `_.isTypedArray` without Node.js optimizations.** @private* @param {*} value The value to check.* @returns {boolean} Returns `true` if `value` is a typed array, else `false`.*/
function baseIsTypedArray(value) {return isObjectLike(value) &&isLength(value.length) && !!typedArrayTags[baseGetTag(value)];
}/*** The base implementation of `_.unary` without support for storing metadata.** @private* @param {Function} func The function to cap arguments for.* @returns {Function} Returns the new capped function.*/
function baseUnary(func) {return function(value) {return func(value);};
}/** Detect free variable `exports`. */
var freeExports$1 = typeof exports == 'object' && exports && !exports.nodeType && exports;/** Detect free variable `module`. */
var freeModule$1 = freeExports$1 && typeof module == 'object' && module && !module.nodeType && module;/** Detect the popular CommonJS extension `module.exports`. */
var moduleExports$1 = freeModule$1 && freeModule$1.exports === freeExports$1;/** Detect free variable `process` from Node.js. */
var freeProcess = moduleExports$1 && freeGlobal.process;/** Used to access faster Node.js helpers. */
var nodeUtil = (function() {try {return freeProcess && freeProcess.binding('util');} catch (e) {}
}());/* Node.js helper references. */
var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;/*** Checks if `value` is classified as a typed array.** @static* @memberOf _* @since 3.0.0* @category Lang* @param {*} value The value to check.* @returns {boolean} Returns `true` if `value` is a typed array, else `false`.* @example** _.isTypedArray(new Uint8Array);* // => true** _.isTypedArray([]);* // => false*/
var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;/** Used for built-in method references. */
var objectProto$2 = Object.prototype;/** Used to check objects for own properties. */
var hasOwnProperty$1 = objectProto$2.hasOwnProperty;/*** Creates an array of the enumerable property names of the array-like `value`.** @private* @param {*} value The value to query.* @param {boolean} inherited Specify returning inherited property names.* @returns {Array} Returns the array of property names.*/
function arrayLikeKeys(value, inherited) {var isArr = isArray(value),isArg = !isArr && isArguments(value),isBuff = !isArr && !isArg && isBuffer(value),isType = !isArr && !isArg && !isBuff && isTypedArray(value),skipIndexes = isArr || isArg || isBuff || isType,result = skipIndexes ? baseTimes(value.length, String) : [],length = result.length;for (var key in value) {if ((inherited || hasOwnProperty$1.call(value, key)) &&!(skipIndexes && (// Safari 9 has enumerable `arguments.length` in strict mode.key == 'length' ||// Node.js 0.10 has enumerable non-index properties on buffers.(isBuff && (key == 'offset' || key == 'parent')) ||// PhantomJS 2 has enumerable non-index properties on typed arrays.(isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||// Skip index properties.
           isIndex(key, length)))) {result.push(key);}}return result;
}/** Used for built-in method references. */
var objectProto$5 = Object.prototype;/*** Checks if `value` is likely a prototype object.** @private* @param {*} value The value to check.* @returns {boolean} Returns `true` if `value` is a prototype, else `false`.*/
function isPrototype(value) {var Ctor = value && value.constructor,proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$5;return value === proto;
}/*** Creates a unary function that invokes `func` with its argument transformed.** @private* @param {Function} func The function to wrap.* @param {Function} transform The argument transform.* @returns {Function} Returns the new function.*/
function overArg(func, transform) {return function(arg) {return func(transform(arg));};
}/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeKeys = overArg(Object.keys, Object);/** Used for built-in method references. */
var objectProto$4 = Object.prototype;/** Used to check objects for own properties. */
var hasOwnProperty$3 = objectProto$4.hasOwnProperty;/*** The base implementation of `_.keys` which doesn't treat sparse arrays as dense.** @private* @param {Object} object The object to query.* @returns {Array} Returns the array of property names.*/
function baseKeys(object) {if (!isPrototype(object)) {return nativeKeys(object);}var result = [];for (var key in Object(object)) {if (hasOwnProperty$3.call(object, key) && key != 'constructor') {result.push(key);}}return result;
}/*** Creates an array of the own enumerable property names of `object`.** **Note:** Non-object values are coerced to objects. See the* [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)* for more details.** @static* @since 0.1.0* @memberOf _* @category Object* @param {Object} object The object to query.* @returns {Array} Returns the array of property names.* @example** function Foo() {*   this.a = 1;*   this.b = 2;* }** Foo.prototype.c = 3;** _.keys(new Foo);* // => ['a', 'b'] (iteration order is not guaranteed)** _.keys('hi');* // => ['0', '1']*/
function keys(object) {return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
}function createArrayIterator(coll) {var i = -1;var len = coll.length;return function next() {return ++i < len ? {value: coll[i], key: i} : null;}
}function createES2015Iterator(iterator) {var i = -1;return function next() {var item = iterator.next();if (item.done)return null;i++;return {value: item.value, key: i};}
}function createObjectIterator(obj) {var okeys = keys(obj);var i = -1;var len = okeys.length;return function next() {var key = okeys[++i];return i < len ? {value: obj[key], key: key} : null;};
}function iterator(coll) {if (isArrayLike(coll)) {return createArrayIterator(coll);}var iterator = getIterator(coll);return iterator ? createES2015Iterator(iterator) : createObjectIterator(coll);
}// 执行一次
function onlyOnce(fn) {return function() {if (fn === null) throw new Error("Callback was already called.");    // 回调已被调用var callFn = fn;fn = null;callFn.apply(this, arguments);    //调用callFn 参数就是用户回调函数中的参数
    };
};function _eachOfLimit(limit) {return function (obj, iteratee, callback) {callback = once(callback || noop);if (limit <= 0 || !obj) {return callback(null);}var nextElem = iterator(obj);var done = false;var running = 0;function iterateeCallback(err, value) {running -= 1;if (err) {done = true;callback(err);}else if (value === breakLoop || (done && running <= 0)) {done = true;return callback(null);}else {replenish();}}function replenish () {while (running < limit && !done) {var elem = nextElem();if (elem === null) {done = true;if (running <= 0) {callback(null);}return;}running += 1;iteratee(elem.value, elem.key, onlyOnce(iterateeCallback));}}replenish();};
}/*** The same as [`eachOf`]{@link module:Collections.eachOf} but runs a maximum of `limit` async operations at a* time.** @name eachOfLimit* @static* @memberOf module:Collections* @method* @see [async.eachOf]{@link module:Collections.eachOf}* @alias forEachOfLimit* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {number} limit - The maximum number of async operations at a time.* @param {AsyncFunction} iteratee - An async function to apply to each* item in `coll`. The `key` is the item's key, or index in the case of an* array.* Invoked with (item, key, callback).* @param {Function} [callback] - A callback which is called when all* `iteratee` functions have finished, or an error occurs. Invoked with (err).*/
function eachOfLimit(coll, limit, iteratee, callback) {_eachOfLimit(limit)(coll, wrapAsync(iteratee), callback);
}function doLimit(fn, limit) {return function (iterable, iteratee, callback) {return fn(iterable, limit, iteratee, callback);};
}// eachOf implementation optimized for array-likes
function eachOfArrayLike(coll, iteratee, callback) {callback = once(callback || noop);var index = 0,completed = 0,length = coll.length;if (length === 0) {callback(null);}function iteratorCallback(err, value) {if (err) {callback(err);} else if ((++completed === length) || value === breakLoop) {callback(null);}}for (; index < length; index++) {iteratee(coll[index], index, onlyOnce(iteratorCallback));}
}// a generic version of eachOf which can handle array, object, and iterator cases.
var eachOfGeneric = doLimit(eachOfLimit, Infinity);/*** Like [`each`]{@link module:Collections.each}, except that it passes the key (or index) as the second argument* to the iteratee.** @name eachOf* @static* @memberOf module:Collections* @method* @alias forEachOf* @category Collection* @see [async.each]{@link module:Collections.each}* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {AsyncFunction} iteratee - A function to apply to each* item in `coll`.* The `key` is the item's key, or index in the case of an array.* Invoked with (item, key, callback).* @param {Function} [callback] - A callback which is called when all* `iteratee` functions have finished, or an error occurs. Invoked with (err).* @example** var obj = {dev: "/dev.json", test: "/test.json", prod: "/prod.json"};* var configs = {};** async.forEachOf(obj, function (value, key, callback) {*     fs.readFile(__dirname + value, "utf8", function (err, data) {*         if (err) return callback(err);*         try {*             configs[key] = JSON.parse(data);*         } catch (e) {*             return callback(e);*         }*         callback();*     });* }, function (err) {*     if (err) console.error(err.message);*     // configs is now a map of JSON data*     doSomethingWith(configs);* });*/
var eachOf = function(coll, iteratee, callback) {var eachOfImplementation = isArrayLike(coll) ? eachOfArrayLike : eachOfGeneric;eachOfImplementation(coll, wrapAsync(iteratee), callback);
};function doParallel(fn) {return function (obj, iteratee, callback) {return fn(eachOf, obj, wrapAsync(iteratee), callback);};
}function _asyncMap(eachfn, arr, iteratee, callback) {callback = callback || noop;arr = arr || [];var results = [];var counter = 0;var _iteratee = wrapAsync(iteratee);eachfn(arr, function (value, _, callback) {var index = counter++;_iteratee(value, function (err, v) {results[index] = v;callback(err);});}, function (err) {callback(err, results);});
}/*** Produces a new collection of values by mapping each value in `coll` through* the `iteratee` function. The `iteratee` is called with an item from `coll`* and a callback for when it has finished processing. Each of these callback* takes 2 arguments: an `error`, and the transformed item from `coll`. If* `iteratee` passes an error to its callback, the main `callback` (for the* `map` function) is immediately called with the error.** Note, that since this function applies the `iteratee` to each item in* parallel, there is no guarantee that the `iteratee` functions will complete* in order. However, the results array will be in the same order as the* original `coll`.** If `map` is passed an Object, the results will be an Array.  The results* will roughly be in the order of the original Objects' keys (but this can* vary across JavaScript engines).** @name map* @static* @memberOf module:Collections* @method* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {AsyncFunction} iteratee - An async function to apply to each item in* `coll`.* The iteratee should complete with the transformed item.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called when all `iteratee`* functions have finished, or an error occurs. Results is an Array of the* transformed items from the `coll`. Invoked with (err, results).* @example** async.map(['file1','file2','file3'], fs.stat, function(err, results) {*     // results is now an array of stats for each file* });*/
var map = doParallel(_asyncMap);/*** Applies the provided arguments to each function in the array, calling* `callback` after all functions have completed. If you only provide the first* argument, `fns`, then it will return a function which lets you pass in the* arguments as if it were a single function call. If more arguments are* provided, `callback` is required while `args` is still optional.** @name applyEach* @static* @memberOf module:ControlFlow* @method* @category Control Flow* @param {Array|Iterable|Object} fns - A collection of {@link AsyncFunction}s* to all call with the same arguments* @param {...*} [args] - any number of separate arguments to pass to the* function.* @param {Function} [callback] - the final argument should be the callback,* called when all functions have completed processing.* @returns {Function} - If only the first argument, `fns`, is provided, it will* return a function which lets you pass in the arguments as if it were a single* function call. The signature is `(..args, callback)`. If invoked with any* arguments, `callback` is required.* @example** async.applyEach([enableSearch, updateSchema], 'bucket', callback);** // partial application example:* async.each(*     buckets,*     async.applyEach([enableSearch, updateSchema]),*     callback* );*/
var applyEach = applyEach$1(map);function doParallelLimit(fn) {return function (obj, limit, iteratee, callback) {return fn(_eachOfLimit(limit), obj, wrapAsync(iteratee), callback);};
}/*** The same as [`map`]{@link module:Collections.map} but runs a maximum of `limit` async operations at a time.** @name mapLimit* @static* @memberOf module:Collections* @method* @see [async.map]{@link module:Collections.map}* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {number} limit - The maximum number of async operations at a time.* @param {AsyncFunction} iteratee - An async function to apply to each item in* `coll`.* The iteratee should complete with the transformed item.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called when all `iteratee`* functions have finished, or an error occurs. Results is an array of the* transformed items from the `coll`. Invoked with (err, results).*/
var mapLimit = doParallelLimit(_asyncMap);/*** The same as [`map`]{@link module:Collections.map} but runs only a single async operation at a time.** @name mapSeries* @static* @memberOf module:Collections* @method* @see [async.map]{@link module:Collections.map}* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {AsyncFunction} iteratee - An async function to apply to each item in* `coll`.* The iteratee should complete with the transformed item.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called when all `iteratee`* functions have finished, or an error occurs. Results is an array of the* transformed items from the `coll`. Invoked with (err, results).*/
var mapSeries = doLimit(mapLimit, 1);/*** The same as [`applyEach`]{@link module:ControlFlow.applyEach} but runs only a single async operation at a time.** @name applyEachSeries* @static* @memberOf module:ControlFlow* @method* @see [async.applyEach]{@link module:ControlFlow.applyEach}* @category Control Flow* @param {Array|Iterable|Object} fns - A collection of {@link AsyncFunction}s to all* call with the same arguments* @param {...*} [args] - any number of separate arguments to pass to the* function.* @param {Function} [callback] - the final argument should be the callback,* called when all functions have completed processing.* @returns {Function} - If only the first argument is provided, it will return* a function which lets you pass in the arguments as if it were a single* function call.*/
var applyEachSeries = applyEach$1(mapSeries);/*** Creates a continuation function with some arguments already applied.** Useful as a shorthand when combined with other control flow functions. Any* arguments passed to the returned function are added to the arguments* originally passed to apply.** @name apply* @static* @memberOf module:Utils* @method* @category Util* @param {Function} fn - The function you want to eventually apply all* arguments to. Invokes with (arguments...).* @param {...*} arguments... - Any number of arguments to automatically apply* when the continuation is called.* @returns {Function} the partially-applied function* @example** // using apply* async.parallel([*     async.apply(fs.writeFile, 'testfile1', 'test1'),*     async.apply(fs.writeFile, 'testfile2', 'test2')* ]);*** // the same process without using apply* async.parallel([*     function(callback) {*         fs.writeFile('testfile1', 'test1', callback);*     },*     function(callback) {*         fs.writeFile('testfile2', 'test2', callback);*     }* ]);** // It's possible to pass any number of additional arguments when calling the* // continuation:** node> var fn = async.apply(sys.puts, 'one');* node> fn('two', 'three');* one* two* three*/
var apply = function(fn/*, ...args*/) {var args = slice(arguments, 1);return function(/*callArgs*/) {var callArgs = slice(arguments);return fn.apply(null, args.concat(callArgs));};
};/*** A specialized version of `_.forEach` for arrays without support for* iteratee shorthands.** @private* @param {Array} [array] The array to iterate over.* @param {Function} iteratee The function invoked per iteration.* @returns {Array} Returns `array`.*/
function arrayEach(array, iteratee) {var index = -1,length = array == null ? 0 : array.length;while (++index < length) {if (iteratee(array[index], index, array) === false) {break;}}return array;
}/*** Creates a base function for methods like `_.forIn` and `_.forOwn`.** @private* @param {boolean} [fromRight] Specify iterating from right to left.* @returns {Function} Returns the new base function.*/
function createBaseFor(fromRight) {return function(object, iteratee, keysFunc) {var index = -1,iterable = Object(object),props = keysFunc(object),length = props.length;while (length--) {var key = props[fromRight ? length : ++index];if (iteratee(iterable[key], key, iterable) === false) {break;}}return object;};
}/*** The base implementation of `baseForOwn` which iterates over `object`* properties returned by `keysFunc` and invokes `iteratee` for each property.* Iteratee functions may exit iteration early by explicitly returning `false`.** @private* @param {Object} object The object to iterate over.* @param {Function} iteratee The function invoked per iteration.* @param {Function} keysFunc The function to get the keys of `object`.* @returns {Object} Returns `object`.*/
var baseFor = createBaseFor();/*** The base implementation of `_.forOwn` without support for iteratee shorthands.** @private* @param {Object} object The object to iterate over.* @param {Function} iteratee The function invoked per iteration.* @returns {Object} Returns `object`.*/
function baseForOwn(object, iteratee) {return object && baseFor(object, iteratee, keys);
}/*** The base implementation of `_.findIndex` and `_.findLastIndex` without* support for iteratee shorthands.** @private* @param {Array} array The array to inspect.* @param {Function} predicate The function invoked per iteration.* @param {number} fromIndex The index to search from.* @param {boolean} [fromRight] Specify iterating from right to left.* @returns {number} Returns the index of the matched value, else `-1`.*/
function baseFindIndex(array, predicate, fromIndex, fromRight) {var length = array.length,index = fromIndex + (fromRight ? 1 : -1);while ((fromRight ? index-- : ++index < length)) {if (predicate(array[index], index, array)) {return index;}}return -1;
}/*** The base implementation of `_.isNaN` without support for number objects.** @private* @param {*} value The value to check.* @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.*/
function baseIsNaN(value) {return value !== value;
}/*** A specialized version of `_.indexOf` which performs strict equality* comparisons of values, i.e. `===`.** @private* @param {Array} array The array to inspect.* @param {*} value The value to search for.* @param {number} fromIndex The index to search from.* @returns {number} Returns the index of the matched value, else `-1`.*/
function strictIndexOf(array, value, fromIndex) {var index = fromIndex - 1,length = array.length;while (++index < length) {if (array[index] === value) {return index;}}return -1;
}/*** The base implementation of `_.indexOf` without `fromIndex` bounds checks.** @private* @param {Array} array The array to inspect.* @param {*} value The value to search for.* @param {number} fromIndex The index to search from.* @returns {number} Returns the index of the matched value, else `-1`.*/
function baseIndexOf(array, value, fromIndex) {return value === value? strictIndexOf(array, value, fromIndex): baseFindIndex(array, baseIsNaN, fromIndex);
}/*** Determines the best order for running the {@link AsyncFunction}s in `tasks`, based on* their requirements. Each function can optionally depend on other functions* being completed first, and each function is run as soon as its requirements* are satisfied.** If any of the {@link AsyncFunction}s pass an error to their callback, the `auto` sequence* will stop. Further tasks will not execute (so any other functions depending* on it will not run), and the main `callback` is immediately called with the* error.** {@link AsyncFunction}s also receive an object containing the results of functions which* have completed so far as the first argument, if they have dependencies. If a* task function has no dependencies, it will only be passed a callback.** @name auto* @static* @memberOf module:ControlFlow* @method* @category Control Flow* @param {Object} tasks - An object. Each of its properties is either a* function or an array of requirements, with the {@link AsyncFunction} itself the last item* in the array. The object's key of a property serves as the name of the task* defined by that property, i.e. can be used when specifying requirements for* other tasks. The function receives one or two arguments:* * a `results` object, containing the results of the previously executed*   functions, only passed if the task has any dependencies,* * a `callback(err, result)` function, which must be called when finished,*   passing an `error` (which can be `null`) and the result of the function's*   execution.* @param {number} [concurrency=Infinity] - An optional `integer` for* determining the maximum number of tasks that can be run in parallel. By* default, as many as possible.* @param {Function} [callback] - An optional callback which is called when all* the tasks have been completed. It receives the `err` argument if any `tasks`* pass an error to their callback. Results are always returned; however, if an* error occurs, no further `tasks` will be performed, and the results object* will only contain partial results. Invoked with (err, results).* @returns undefined* @example** async.auto({*     // this function will just be passed a callback*     readData: async.apply(fs.readFile, 'data.txt', 'utf-8'),*     showData: ['readData', function(results, cb) {*         // results.readData is the file's contents*         // ...*     }]* }, callback);** async.auto({*     get_data: function(callback) {*         console.log('in get_data');*         // async code to get some data*         callback(null, 'data', 'converted to array');*     },*     make_folder: function(callback) {*         console.log('in make_folder');*         // async code to create a directory to store a file in*         // this is run at the same time as getting the data*         callback(null, 'folder');*     },*     write_file: ['get_data', 'make_folder', function(results, callback) {*         console.log('in write_file', JSON.stringify(results));*         // once there is some data and the directory exists,*         // write the data to a file in the directory*         callback(null, 'filename');*     }],*     email_link: ['write_file', function(results, callback) {*         console.log('in email_link', JSON.stringify(results));*         // once the file is written let's email a link to it...*         // results.write_file contains the filename returned by write_file.*         callback(null, {'file':results.write_file, 'email':'user@example.com'});*     }]* }, function(err, results) {*     console.log('err = ', err);*     console.log('results = ', results);* });*/
var auto = function (tasks, concurrency, callback) {if (typeof concurrency === 'function') {// concurrency is optional, shift the args.callback = concurrency;concurrency = null;}callback = once(callback || noop);var keys$$1 = keys(tasks);var numTasks = keys$$1.length;if (!numTasks) {return callback(null);}if (!concurrency) {concurrency = numTasks;}var results = {};var runningTasks = 0;var hasError = false;var listeners = Object.create(null);var readyTasks = [];// for cycle detection:var readyToCheck = []; // tasks that have been identified as reachable// without the possibility of returning to an ancestor taskvar uncheckedDependencies = {};baseForOwn(tasks, function (task, key) {if (!isArray(task)) {// no dependencies
            enqueueTask(key, [task]);readyToCheck.push(key);return;}var dependencies = task.slice(0, task.length - 1);var remainingDependencies = dependencies.length;if (remainingDependencies === 0) {enqueueTask(key, task);readyToCheck.push(key);return;}uncheckedDependencies[key] = remainingDependencies;arrayEach(dependencies, function (dependencyName) {if (!tasks[dependencyName]) {throw new Error('async.auto task `' + key +'` has a non-existent dependency `' +dependencyName + '` in ' +dependencies.join(', '));}addListener(dependencyName, function () {remainingDependencies--;if (remainingDependencies === 0) {enqueueTask(key, task);}});});});checkForDeadlocks();processQueue();function enqueueTask(key, task) {readyTasks.push(function () {runTask(key, task);});}function processQueue() {if (readyTasks.length === 0 && runningTasks === 0) {return callback(null, results);}while(readyTasks.length && runningTasks < concurrency) {var run = readyTasks.shift();run();}}function addListener(taskName, fn) {var taskListeners = listeners[taskName];if (!taskListeners) {taskListeners = listeners[taskName] = [];}taskListeners.push(fn);}function taskComplete(taskName) {var taskListeners = listeners[taskName] || [];arrayEach(taskListeners, function (fn) {fn();});processQueue();}function runTask(key, task) {if (hasError) return;var taskCallback = onlyOnce(function(err, result) {runningTasks--;if (arguments.length > 2) {result = slice(arguments, 1);}if (err) {var safeResults = {};baseForOwn(results, function(val, rkey) {safeResults[rkey] = val;});safeResults[key] = result;hasError = true;listeners = Object.create(null);callback(err, safeResults);} else {results[key] = result;taskComplete(key);}});runningTasks++;var taskFn = wrapAsync(task[task.length - 1]);if (task.length > 1) {taskFn(results, taskCallback);} else {taskFn(taskCallback);}}function checkForDeadlocks() {// Kahn's algorithm// https://en.wikipedia.org/wiki/Topological_sorting#Kahn.27s_algorithm// http://connalle.blogspot.com/2013/10/topological-sortingkahn-algorithm.htmlvar currentTask;var counter = 0;while (readyToCheck.length) {currentTask = readyToCheck.pop();counter++;arrayEach(getDependents(currentTask), function (dependent) {if (--uncheckedDependencies[dependent] === 0) {readyToCheck.push(dependent);}});}if (counter !== numTasks) {throw new Error('async.auto cannot execute tasks due to a recursive dependency');}}function getDependents(taskName) {var result = [];baseForOwn(tasks, function (task, key) {if (isArray(task) && baseIndexOf(task, taskName, 0) >= 0) {result.push(key);}});return result;}
};/*** A specialized version of `_.map` for arrays without support for iteratee* shorthands.** @private* @param {Array} [array] The array to iterate over.* @param {Function} iteratee The function invoked per iteration.* @returns {Array} Returns the new mapped array.*/
function arrayMap(array, iteratee) {var index = -1,length = array == null ? 0 : array.length,result = Array(length);while (++index < length) {result[index] = iteratee(array[index], index, array);}return result;
}/** `Object#toString` result references. */
var symbolTag = '[object Symbol]';/*** Checks if `value` is classified as a `Symbol` primitive or object.** @static* @memberOf _* @since 4.0.0* @category Lang* @param {*} value The value to check.* @returns {boolean} Returns `true` if `value` is a symbol, else `false`.* @example** _.isSymbol(Symbol.iterator);* // => true** _.isSymbol('abc');* // => false*/
function isSymbol(value) {return typeof value == 'symbol' ||(isObjectLike(value) && baseGetTag(value) == symbolTag);
}/** Used as references for various `Number` constants. */
var INFINITY = 1 / 0;/** Used to convert symbols to primitives and strings. */
var symbolProto = Symbol$1 ? Symbol$1.prototype : undefined;
var symbolToString = symbolProto ? symbolProto.toString : undefined;/*** The base implementation of `_.toString` which doesn't convert nullish* values to empty strings.** @private* @param {*} value The value to process.* @returns {string} Returns the string.*/
function baseToString(value) {// Exit early for strings to avoid a performance hit in some environments.if (typeof value == 'string') {return value;}if (isArray(value)) {// Recursively convert values (susceptible to call stack limits).return arrayMap(value, baseToString) + '';}if (isSymbol(value)) {return symbolToString ? symbolToString.call(value) : '';}var result = (value + '');return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
}/*** The base implementation of `_.slice` without an iteratee call guard.** @private* @param {Array} array The array to slice.* @param {number} [start=0] The start position.* @param {number} [end=array.length] The end position.* @returns {Array} Returns the slice of `array`.*/
function baseSlice(array, start, end) {var index = -1,length = array.length;if (start < 0) {start = -start > length ? 0 : (length + start);}end = end > length ? length : end;if (end < 0) {end += length;}length = start > end ? 0 : ((end - start) >>> 0);start >>>= 0;var result = Array(length);while (++index < length) {result[index] = array[index + start];}return result;
}/*** Casts `array` to a slice if it's needed.** @private* @param {Array} array The array to inspect.* @param {number} start The start position.* @param {number} [end=array.length] The end position.* @returns {Array} Returns the cast slice.*/
function castSlice(array, start, end) {var length = array.length;end = end === undefined ? length : end;return (!start && end >= length) ? array : baseSlice(array, start, end);
}/*** Used by `_.trim` and `_.trimEnd` to get the index of the last string symbol* that is not found in the character symbols.** @private* @param {Array} strSymbols The string symbols to inspect.* @param {Array} chrSymbols The character symbols to find.* @returns {number} Returns the index of the last unmatched string symbol.*/
function charsEndIndex(strSymbols, chrSymbols) {var index = strSymbols.length;while (index-- && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}return index;
}/*** Used by `_.trim` and `_.trimStart` to get the index of the first string symbol* that is not found in the character symbols.** @private* @param {Array} strSymbols The string symbols to inspect.* @param {Array} chrSymbols The character symbols to find.* @returns {number} Returns the index of the first unmatched string symbol.*/
function charsStartIndex(strSymbols, chrSymbols) {var index = -1,length = strSymbols.length;while (++index < length && baseIndexOf(chrSymbols, strSymbols[index], 0) > -1) {}return index;
}/*** Converts an ASCII `string` to an array.** @private* @param {string} string The string to convert.* @returns {Array} Returns the converted array.*/
function asciiToArray(string) {return string.split('');
}/** Used to compose unicode character classes. */
var rsAstralRange = '\\ud800-\\udfff';
var rsComboMarksRange = '\\u0300-\\u036f\\ufe20-\\ufe23';
var rsComboSymbolsRange = '\\u20d0-\\u20f0';
var rsVarRange = '\\ufe0e\\ufe0f';/** Used to compose unicode capture groups. */
var rsZWJ = '\\u200d';/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */
var reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange  + rsComboMarksRange + rsComboSymbolsRange + rsVarRange + ']');/*** Checks if `string` contains Unicode symbols.** @private* @param {string} string The string to inspect.* @returns {boolean} Returns `true` if a symbol is found, else `false`.*/
function hasUnicode(string) {return reHasUnicode.test(string);
}/** Used to compose unicode character classes. */
var rsAstralRange$1 = '\\ud800-\\udfff';
var rsComboMarksRange$1 = '\\u0300-\\u036f\\ufe20-\\ufe23';
var rsComboSymbolsRange$1 = '\\u20d0-\\u20f0';
var rsVarRange$1 = '\\ufe0e\\ufe0f';/** Used to compose unicode capture groups. */
var rsAstral = '[' + rsAstralRange$1 + ']';
var rsCombo = '[' + rsComboMarksRange$1 + rsComboSymbolsRange$1 + ']';
var rsFitz = '\\ud83c[\\udffb-\\udfff]';
var rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')';
var rsNonAstral = '[^' + rsAstralRange$1 + ']';
var rsRegional = '(?:\\ud83c[\\udde6-\\uddff]){2}';
var rsSurrPair = '[\\ud800-\\udbff][\\udc00-\\udfff]';
var rsZWJ$1 = '\\u200d';/** Used to compose unicode regexes. */
var reOptMod = rsModifier + '?';
var rsOptVar = '[' + rsVarRange$1 + ']?';
var rsOptJoin = '(?:' + rsZWJ$1 + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*';
var rsSeq = rsOptVar + reOptMod + rsOptJoin;
var rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */
var reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');/*** Converts a Unicode `string` to an array.** @private* @param {string} string The string to convert.* @returns {Array} Returns the converted array.*/
function unicodeToArray(string) {return string.match(reUnicode) || [];
}/*** Converts `string` to an array.** @private* @param {string} string The string to convert.* @returns {Array} Returns the converted array.*/
function stringToArray(string) {return hasUnicode(string)? unicodeToArray(string): asciiToArray(string);
}/*** Converts `value` to a string. An empty string is returned for `null`* and `undefined` values. The sign of `-0` is preserved.** @static* @memberOf _* @since 4.0.0* @category Lang* @param {*} value The value to convert.* @returns {string} Returns the converted string.* @example** _.toString(null);* // => ''** _.toString(-0);* // => '-0'** _.toString([1, 2, 3]);* // => '1,2,3'*/
function toString(value) {return value == null ? '' : baseToString(value);
}/** Used to match leading and trailing whitespace. */
var reTrim = /^\s+|\s+$/g;/*** Removes leading and trailing whitespace or specified characters from `string`.** @static* @memberOf _* @since 3.0.0* @category String* @param {string} [string=''] The string to trim.* @param {string} [chars=whitespace] The characters to trim.* @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.* @returns {string} Returns the trimmed string.* @example** _.trim('  abc  ');* // => 'abc'** _.trim('-_-abc-_-', '_-');* // => 'abc'** _.map(['  foo  ', '  bar  '], _.trim);* // => ['foo', 'bar']*/
function trim(string, chars, guard) {string = toString(string);if (string && (guard || chars === undefined)) {return string.replace(reTrim, '');}if (!string || !(chars = baseToString(chars))) {return string;}var strSymbols = stringToArray(string),chrSymbols = stringToArray(chars),start = charsStartIndex(strSymbols, chrSymbols),end = charsEndIndex(strSymbols, chrSymbols) + 1;return castSlice(strSymbols, start, end).join('');
}var FN_ARGS = /^(?:async\s+)?(function)?\s*[^\(]*\(\s*([^\)]*)\)/m;
var FN_ARG_SPLIT = /,/;
var FN_ARG = /(=.+)?(\s*)$/;
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;function parseParams(func) {func = func.toString().replace(STRIP_COMMENTS, '');func = func.match(FN_ARGS)[2].replace(' ', '');func = func ? func.split(FN_ARG_SPLIT) : [];func = func.map(function (arg){return trim(arg.replace(FN_ARG, ''));});return func;
}/*** A dependency-injected version of the [async.auto]{@link module:ControlFlow.auto} function. Dependent* tasks are specified as parameters to the function, after the usual callback* parameter, with the parameter names matching the names of the tasks it* depends on. This can provide even more readable task graphs which can be* easier to maintain.** If a final callback is specified, the task results are similarly injected,* specified as named parameters after the initial error parameter.** The autoInject function is purely syntactic sugar and its semantics are* otherwise equivalent to [async.auto]{@link module:ControlFlow.auto}.** @name autoInject* @static* @memberOf module:ControlFlow* @method* @see [async.auto]{@link module:ControlFlow.auto}* @category Control Flow* @param {Object} tasks - An object, each of whose properties is an {@link AsyncFunction} of* the form 'func([dependencies...], callback). The object's key of a property* serves as the name of the task defined by that property, i.e. can be used* when specifying requirements for other tasks.* * The `callback` parameter is a `callback(err, result)` which must be called*   when finished, passing an `error` (which can be `null`) and the result of*   the function's execution. The remaining parameters name other tasks on*   which the task is dependent, and the results from those tasks are the*   arguments of those parameters.* @param {Function} [callback] - An optional callback which is called when all* the tasks have been completed. It receives the `err` argument if any `tasks`* pass an error to their callback, and a `results` object with any completed* task results, similar to `auto`.* @example** //  The example from `auto` can be rewritten as follows:* async.autoInject({*     get_data: function(callback) {*         // async code to get some data*         callback(null, 'data', 'converted to array');*     },*     make_folder: function(callback) {*         // async code to create a directory to store a file in*         // this is run at the same time as getting the data*         callback(null, 'folder');*     },*     write_file: function(get_data, make_folder, callback) {*         // once there is some data and the directory exists,*         // write the data to a file in the directory*         callback(null, 'filename');*     },*     email_link: function(write_file, callback) {*         // once the file is written let's email a link to it...*         // write_file contains the filename returned by write_file.*         callback(null, {'file':write_file, 'email':'user@example.com'});*     }* }, function(err, results) {*     console.log('err = ', err);*     console.log('email_link = ', results.email_link);* });** // If you are using a JS minifier that mangles parameter names, `autoInject`* // will not work with plain functions, since the parameter names will be* // collapsed to a single letter identifier.  To work around this, you can* // explicitly specify the names of the parameters your task function needs* // in an array, similar to Angular.js dependency injection.** // This still has an advantage over plain `auto`, since the results a task* // depends on are still spread into arguments.* async.autoInject({*     //...*     write_file: ['get_data', 'make_folder', function(get_data, make_folder, callback) {*         callback(null, 'filename');*     }],*     email_link: ['write_file', function(write_file, callback) {*         callback(null, {'file':write_file, 'email':'user@example.com'});*     }]*     //...* }, function(err, results) {*     console.log('err = ', err);*     console.log('email_link = ', results.email_link);* });*/
function autoInject(tasks, callback) {var newTasks = {};baseForOwn(tasks, function (taskFn, key) {var params;var fnIsAsync = isAsync(taskFn);var hasNoDeps =(!fnIsAsync && taskFn.length === 1) ||(fnIsAsync && taskFn.length === 0);if (isArray(taskFn)) {params = taskFn.slice(0, -1);taskFn = taskFn[taskFn.length - 1];newTasks[key] = params.concat(params.length > 0 ? newTask : taskFn);} else if (hasNoDeps) {// no dependencies, use the function as-isnewTasks[key] = taskFn;} else {params = parseParams(taskFn);if (taskFn.length === 0 && !fnIsAsync && params.length === 0) {throw new Error("autoInject task functions require explicit parameters.");}// remove callback paramif (!fnIsAsync) params.pop();newTasks[key] = params.concat(newTask);}function newTask(results, taskCb) {var newArgs = arrayMap(params, function (name) {return results[name];});newArgs.push(taskCb);wrapAsync(taskFn).apply(null, newArgs);}});auto(newTasks, callback);
}// Simple doubly linked list (https://en.wikipedia.org/wiki/Doubly_linked_list) implementation
// used for queues. This implementation assumes that the node provided by the user can be modified
// to adjust the next and last properties. We implement only the minimal functionality
// for queue support.
function DLL() {this.head = this.tail = null;this.length = 0;
}function setInitial(dll, node) {dll.length = 1;dll.head = dll.tail = node;
}DLL.prototype.removeLink = function(node) {if (node.prev) node.prev.next = node.next;else this.head = node.next;if (node.next) node.next.prev = node.prev;else this.tail = node.prev;node.prev = node.next = null;this.length -= 1;return node;
};DLL.prototype.empty = function () {while(this.head) this.shift();return this;
};DLL.prototype.insertAfter = function(node, newNode) {newNode.prev = node;newNode.next = node.next;if (node.next) node.next.prev = newNode;else this.tail = newNode;node.next = newNode;this.length += 1;
};DLL.prototype.insertBefore = function(node, newNode) {newNode.prev = node.prev;newNode.next = node;if (node.prev) node.prev.next = newNode;else this.head = newNode;node.prev = newNode;this.length += 1;
};DLL.prototype.unshift = function(node) {if (this.head) this.insertBefore(this.head, node);else setInitial(this, node);
};DLL.prototype.push = function(node) {if (this.tail) this.insertAfter(this.tail, node);else setInitial(this, node);
};DLL.prototype.shift = function() {return this.head && this.removeLink(this.head);
};DLL.prototype.pop = function() {return this.tail && this.removeLink(this.tail);
};DLL.prototype.toArray = function () {var arr = Array(this.length);var curr = this.head;for(var idx = 0; idx < this.length; idx++) {arr[idx] = curr.data;curr = curr.next;}return arr;
};DLL.prototype.remove = function (testFn) {var curr = this.head;while(!!curr) {var next = curr.next;if (testFn(curr)) {this.removeLink(curr);}curr = next;}return this;
};function queue(worker, concurrency, payload) {if (concurrency == null) {concurrency = 1;}else if(concurrency === 0) {throw new Error('Concurrency must not be zero');}var _worker = wrapAsync(worker);var numRunning = 0;var workersList = [];function _insert(data, insertAtFront, 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 tasksreturn setImmediate$1(function() {q.drain();});}for (var i = 0, l = data.length; i < l; i++) {var item = {data: data[i],callback: callback || noop};if (insertAtFront) {q._tasks.unshift(item);} else {q._tasks.push(item);}}setImmediate$1(q.process);}function _next(tasks) {return function(err){numRunning -= 1;for (var i = 0, l = tasks.length; i < l; i++) {var task = tasks[i];var index = baseIndexOf(workersList, task, 0);if (index >= 0) {workersList.splice(index);}task.callback.apply(task, arguments);if (err != null) {q.error(err, task.data);}}if (numRunning <= (q.concurrency - q.buffer) ) {q.unsaturated();}if (q.idle()) {q.drain();}q.process();};}var isProcessing = false;var q = {_tasks: new DLL(),concurrency: concurrency,payload: payload,saturated: noop,unsaturated:noop,buffer: concurrency / 4,empty: noop,drain: noop,error: noop,started: false,paused: false,push: function (data, callback) {_insert(data, false, callback);},kill: function () {q.drain = noop;q._tasks.empty();},unshift: function (data, callback) {_insert(data, true, callback);},remove: function (testFn) {q._tasks.remove(testFn);},process: function () {// Avoid trying to start too many processing operations. This can occur// when callbacks resolve synchronously (#1267).if (isProcessing) {return;}isProcessing = true;while(!q.paused && numRunning < q.concurrency && q._tasks.length){var tasks = [], data = [];var l = q._tasks.length;if (q.payload) l = Math.min(l, q.payload);for (var i = 0; i < l; i++) {var node = q._tasks.shift();tasks.push(node);data.push(node.data);}numRunning += 1;workersList.push(tasks[0]);if (q._tasks.length === 0) {q.empty();}if (numRunning === q.concurrency) {q.saturated();}var cb = onlyOnce(_next(tasks));_worker(data, cb);}isProcessing = false;},length: function () {return q._tasks.length;},running: function () {return numRunning;},workersList: function () {return workersList;},idle: function() {return q._tasks.length + numRunning === 0;},pause: function () {q.paused = true;},resume: function () {if (q.paused === false) { return; }q.paused = false;setImmediate$1(q.process);}};return q;
}/*** A cargo of tasks for the worker function to complete. Cargo inherits all of* the same methods and event callbacks as [`queue`]{@link module:ControlFlow.queue}.* @typedef {Object} CargoObject* @memberOf module:ControlFlow* @property {Function} length - A function returning the number of items* waiting to be processed. Invoke like `cargo.length()`.* @property {number} payload - An `integer` for determining how many tasks* should be process per round. This property can be changed after a `cargo` is* created to alter the payload on-the-fly.* @property {Function} push - Adds `task` to the `queue`. The callback is* called once the `worker` has finished processing the task. Instead of a* single task, an array of `tasks` can be submitted. The respective callback is* used for every task in the list. Invoke like `cargo.push(task, [callback])`.* @property {Function} saturated - A callback that is called when the* `queue.length()` hits the concurrency and further tasks will be queued.* @property {Function} empty - A callback that is called when the last item* from the `queue` is given to a `worker`.* @property {Function} drain - A callback that is called when the last item* from the `queue` has returned from the `worker`.* @property {Function} idle - a function returning false if there are items* waiting or being processed, or true if not. Invoke like `cargo.idle()`.* @property {Function} pause - a function that pauses the processing of tasks* until `resume()` is called. Invoke like `cargo.pause()`.* @property {Function} resume - a function that resumes the processing of* queued tasks when the queue is paused. Invoke like `cargo.resume()`.* @property {Function} kill - a function that removes the `drain` callback and* empties remaining tasks from the queue forcing it to go idle. Invoke like `cargo.kill()`.*//*** Creates a `cargo` object with the specified payload. Tasks added to the* cargo will be processed altogether (up to the `payload` limit). If the* `worker` is in progress, the task is queued until it becomes available. Once* the `worker` has completed some tasks, each callback of those tasks is* called. Check out [these](https://camo.githubusercontent.com/6bbd36f4cf5b35a0f11a96dcd2e97711ffc2fb37/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130382f62626330636662302d356632392d313165322d393734662d3333393763363464633835382e676966) [animations](https://camo.githubusercontent.com/f4810e00e1c5f5f8addbe3e9f49064fd5d102699/68747470733a2f2f662e636c6f75642e6769746875622e636f6d2f6173736574732f313637363837312f36383130312f38346339323036362d356632392d313165322d383134662d3964336430323431336266642e676966)* for how `cargo` and `queue` work.** While [`queue`]{@link module:ControlFlow.queue} passes only one task to one of a group of workers* at a time, cargo passes an array of tasks to a single worker, repeating* when the worker is finished.** @name cargo* @static* @memberOf module:ControlFlow* @method* @see [async.queue]{@link module:ControlFlow.queue}* @category Control Flow* @param {AsyncFunction} worker - An asynchronous function for processing an array* of queued tasks. Invoked with `(tasks, callback)`.* @param {number} [payload=Infinity] - An optional `integer` for determining* how many tasks should be processed per round; if omitted, the default is* unlimited.* @returns {module:ControlFlow.CargoObject} A cargo object to manage the tasks. Callbacks can* attached as certain properties to listen for specific events during the* lifecycle of the cargo and inner queue.* @example** // create a cargo object with payload 2* var cargo = async.cargo(function(tasks, callback) {*     for (var i=0; i<tasks.length; i++) {*         console.log('hello ' + tasks[i].name);*     }*     callback();* }, 2);** // add some items* cargo.push({name: 'foo'}, function(err) {*     console.log('finished processing foo');* });* cargo.push({name: 'bar'}, function(err) {*     console.log('finished processing bar');* });* cargo.push({name: 'baz'}, function(err) {*     console.log('finished processing baz');* });*/
function cargo(worker, payload) {return queue(worker, 1, payload);
}/*** The same as [`eachOf`]{@link module:Collections.eachOf} but runs only a single async operation at a time.** @name eachOfSeries* @static* @memberOf module:Collections* @method* @see [async.eachOf]{@link module:Collections.eachOf}* @alias forEachOfSeries* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {AsyncFunction} iteratee - An async function to apply to each item in* `coll`.* Invoked with (item, key, callback).* @param {Function} [callback] - A callback which is called when all `iteratee`* functions have finished, or an error occurs. Invoked with (err).*/
var eachOfSeries = doLimit(eachOfLimit, 1);/*** Reduces `coll` into a single value using an async `iteratee` to return each* successive step. `memo` is the initial state of the reduction. This function* only operates in series.** For performance reasons, it may make sense to split a call to this function* into a parallel map, and then use the normal `Array.prototype.reduce` on the* results. This function is for situations where each step in the reduction* needs to be async; if you can get the data before reducing it, then it's* probably a good idea to do so.** @name reduce* @static* @memberOf module:Collections* @method* @alias inject* @alias foldl* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {*} memo - The initial state of the reduction.* @param {AsyncFunction} iteratee - A function applied to each item in the* array to produce the next step in the reduction.* The `iteratee` should complete with the next state of the reduction.* If the iteratee complete with an error, the reduction is stopped and the* main `callback` is immediately called with the error.* Invoked with (memo, item, callback).* @param {Function} [callback] - A callback which is called after all the* `iteratee` functions have finished. Result is the reduced value. Invoked with* (err, result).* @example** async.reduce([1,2,3], 0, function(memo, item, callback) {*     // pointless async:*     process.nextTick(function() {*         callback(null, memo + item)*     });* }, function(err, result) {*     // result is now equal to the last value of memo, which is 6* });*/
function reduce(coll, memo, iteratee, callback) {callback = once(callback || noop);var _iteratee = wrapAsync(iteratee);eachOfSeries(coll, function(x, i, callback) {_iteratee(memo, x, function(err, v) {memo = v;callback(err);});}, function(err) {callback(err, memo);});
}/*** Version of the compose function that is more natural to read. Each function* consumes the return value of the previous function. It is the equivalent of* [compose]{@link module:ControlFlow.compose} with the arguments reversed.** Each function is executed with the `this` binding of the composed function.** @name seq* @static* @memberOf module:ControlFlow* @method* @see [async.compose]{@link module:ControlFlow.compose}* @category Control Flow* @param {...AsyncFunction} functions - the asynchronous functions to compose* @returns {Function} a function that composes the `functions` in order* @example** // Requires lodash (or underscore), express3 and dresende's orm2.* // Part of an app, that fetches cats of the logged user.* // This example uses `seq` function to avoid overnesting and error* // handling clutter.* app.get('/cats', function(request, response) {*     var User = request.models.User;*     async.seq(*         _.bind(User.get, User),  // 'User.get' has signature (id, callback(err, data))*         function(user, fn) {*             user.getCats(fn);      // 'getCats' has signature (callback(err, data))*         }*     )(req.session.user_id, function (err, cats) {*         if (err) {*             console.error(err);*             response.json({ status: 'error', message: err.message });*         } else {*             response.json({ status: 'ok', message: 'Cats found', data: cats });*         }*     });* });*/
function seq(/*...functions*/) {var _functions = arrayMap(arguments, wrapAsync);return function(/*...args*/) {var args = slice(arguments);var that = this;var cb = args[args.length - 1];if (typeof cb == 'function') {args.pop();} else {cb = noop;}reduce(_functions, args, function(newargs, fn, cb) {fn.apply(that, newargs.concat(function(err/*, ...nextargs*/) {var nextargs = slice(arguments, 1);cb(err, nextargs);}));},function(err, results) {cb.apply(that, [err].concat(results));});};
}/*** Creates a function which is a composition of the passed asynchronous* functions. Each function consumes the return value of the function that* follows. Composing functions `f()`, `g()`, and `h()` would produce the result* of `f(g(h()))`, only this version uses callbacks to obtain the return values.** Each function is executed with the `this` binding of the composed function.** @name compose* @static* @memberOf module:ControlFlow* @method* @category Control Flow* @param {...AsyncFunction} functions - the asynchronous functions to compose* @returns {Function} an asynchronous function that is the composed* asynchronous `functions`* @example** function add1(n, callback) {*     setTimeout(function () {*         callback(null, n + 1);*     }, 10);* }** function mul3(n, callback) {*     setTimeout(function () {*         callback(null, n * 3);*     }, 10);* }** var add1mul3 = async.compose(mul3, add1);* add1mul3(4, function (err, result) {*     // result now equals 15* });*/
var compose = function(/*...args*/) {return seq.apply(null, slice(arguments).reverse());
};function concat$1(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);});
}/*** Applies `iteratee` to each item in `coll`, concatenating the results. Returns* the concatenated list. The `iteratee`s are called in parallel, and the* results are concatenated as they return. There is no guarantee that the* results array will be returned in the original order of `coll` passed to the* `iteratee` function.** @name concat* @static* @memberOf module:Collections* @method* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {AsyncFunction} iteratee - A function to apply to each item in `coll`,* which should use an array as its result. Invoked with (item, callback).* @param {Function} [callback(err)] - A callback which is called after all the* `iteratee` functions have finished, or an error occurs. Results is an array* containing the concatenated results of the `iteratee` function. Invoked with* (err, results).* @example** async.concat(['dir1','dir2','dir3'], fs.readdir, function(err, files) {*     // files is now a list of filenames that exist in the 3 directories* });*/
var concat = doParallel(concat$1);function doSeries(fn) {return function (obj, iteratee, callback) {return fn(eachOfSeries, obj, wrapAsync(iteratee), callback);};
}/*** The same as [`concat`]{@link module:Collections.concat} but runs only a single async operation at a time.** @name concatSeries* @static* @memberOf module:Collections* @method* @see [async.concat]{@link module:Collections.concat}* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {AsyncFunction} iteratee - A function to apply to each item in `coll`.* The iteratee should complete with an array an array of results.* Invoked with (item, callback).* @param {Function} [callback(err)] - A callback which is called after all the* `iteratee` functions have finished, or an error occurs. Results is an array* containing the concatenated results of the `iteratee` function. Invoked with* (err, results).*/
var concatSeries = doSeries(concat$1);/*** Returns a function that when called, calls-back with the values provided.* Useful as the first function in a [`waterfall`]{@link module:ControlFlow.waterfall}, or for plugging values in to* [`auto`]{@link module:ControlFlow.auto}.** @name constant* @static* @memberOf module:Utils* @method* @category Util* @param {...*} arguments... - Any number of arguments to automatically invoke* callback with.* @returns {AsyncFunction} Returns a function that when invoked, automatically* invokes the callback with the previous given arguments.* @example** async.waterfall([*     async.constant(42),*     function (value, next) {*         // value === 42*     },*     //...* ], callback);** async.waterfall([*     async.constant(filename, "utf8"),*     fs.readFile,*     function (fileData, next) {*         //...*     }*     //...* ], callback);** async.auto({*     hostname: async.constant("https://server.net/"),*     port: findFreePort,*     launchServer: ["hostname", "port", function (options, cb) {*         startServer(options, cb);*     }],*     //...* }, callback);*/
var constant = function(/*...values*/) {var values = slice(arguments);var args = [null].concat(values);return function (/*...ignoredArgs, callback*/) {var callback = arguments[arguments.length - 1];return callback.apply(this, args);};
};/*** This method returns the first argument it receives.** @static* @since 0.1.0* @memberOf _* @category Util* @param {*} value Any value.* @returns {*} Returns `value`.* @example** var object = { 'a': 1 };** console.log(_.identity(object) === object);* // => true*/
function identity(value) {return value;
}function _createTester(check, getResult) {return function(eachfn, arr, iteratee, cb) {cb = cb || noop;var testPassed = false;var testResult;eachfn(arr, function(value, _, callback) {iteratee(value, function(err, result) {if (err) {callback(err);} else if (check(result) && !testResult) {testPassed = true;testResult = getResult(true, value);callback(null, breakLoop);} else {callback();}});}, function(err) {if (err) {cb(err);} else {cb(null, testPassed ? testResult : getResult(false));}});};
}function _findGetResult(v, x) {return x;
}/*** Returns the first value in `coll` that passes an async truth test. The* `iteratee` is applied in parallel, meaning the first iteratee to return* `true` will fire the detect `callback` with that result. That means the* result might not be the first item in the original `coll` (in terms of order)* that passes the test.* If order within the original `coll` is important, then look at* [`detectSeries`]{@link module:Collections.detectSeries}.** @name detect* @static* @memberOf module:Collections* @method* @alias find* @category Collections* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`.* The iteratee must complete with a boolean value as its result.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called as soon as any* iteratee returns `true`, or after all the `iteratee` functions have finished.* Result will be the first item in the array that passes the truth test* (iteratee) or the value `undefined` if none passed. Invoked with* (err, result).* @example** async.detect(['file1','file2','file3'], function(filePath, callback) {*     fs.access(filePath, function(err) {*         callback(null, !err)*     });* }, function(err, result) {*     // result now equals the first file in the list that exists* });*/
var detect = doParallel(_createTester(identity, _findGetResult));/*** The same as [`detect`]{@link module:Collections.detect} but runs a maximum of `limit` async operations at a* time.** @name detectLimit* @static* @memberOf module:Collections* @method* @see [async.detect]{@link module:Collections.detect}* @alias findLimit* @category Collections* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {number} limit - The maximum number of async operations at a time.* @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`.* The iteratee must complete with a boolean value as its result.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called as soon as any* iteratee returns `true`, or after all the `iteratee` functions have finished.* Result will be the first item in the array that passes the truth test* (iteratee) or the value `undefined` if none passed. Invoked with* (err, result).*/
var detectLimit = doParallelLimit(_createTester(identity, _findGetResult));/*** The same as [`detect`]{@link module:Collections.detect} but runs only a single async operation at a time.** @name detectSeries* @static* @memberOf module:Collections* @method* @see [async.detect]{@link module:Collections.detect}* @alias findSeries* @category Collections* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {AsyncFunction} iteratee - A truth test to apply to each item in `coll`.* The iteratee must complete with a boolean value as its result.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called as soon as any* iteratee returns `true`, or after all the `iteratee` functions have finished.* Result will be the first item in the array that passes the truth test* (iteratee) or the value `undefined` if none passed. Invoked with* (err, result).*/
var detectSeries = doLimit(detectLimit, 1);function consoleFunc(name) {return function (fn/*, ...args*/) {var args = slice(arguments, 1);args.push(function (err/*, ...args*/) {var args = slice(arguments, 1);if (typeof console === 'object') {if (err) {if (console.error) {console.error(err);}} else if (console[name]) {arrayEach(args, function (x) {console[name](x);});}}});wrapAsync(fn).apply(null, args);};
}/*** Logs the result of an [`async` function]{@link AsyncFunction} to the* `console` using `console.dir` to display the properties of the resulting object.* Only works in Node.js or in browsers that support `console.dir` and* `console.error` (such as FF and Chrome).* If multiple arguments are returned from the async function,* `console.dir` is called on each argument in order.** @name dir* @static* @memberOf module:Utils* @method* @category Util* @param {AsyncFunction} function - The function you want to eventually apply* all arguments to.* @param {...*} arguments... - Any number of arguments to apply to the function.* @example** // in a module* var hello = function(name, callback) {*     setTimeout(function() {*         callback(null, {hello: name});*     }, 1000);* };** // in the node repl* node> async.dir(hello, 'world');* {hello: 'world'}*/
var dir = consoleFunc('dir');/*** The post-check version of [`during`]{@link module:ControlFlow.during}. To reflect the difference in* the order of operations, the arguments `test` and `fn` are switched.** Also a version of [`doWhilst`]{@link module:ControlFlow.doWhilst} with asynchronous `test` function.* @name doDuring* @static* @memberOf module:ControlFlow* @method* @see [async.during]{@link module:ControlFlow.during}* @category Control Flow* @param {AsyncFunction} fn - An async function which is called each time* `test` passes. Invoked with (callback).* @param {AsyncFunction} test - asynchronous truth test to perform before each* execution of `fn`. Invoked with (...args, callback), where `...args` are the* non-error args from the previous callback of `fn`.* @param {Function} [callback] - A callback which is called after the test* function has failed and repeated execution of `fn` has stopped. `callback`* will be passed an error if one occurred, otherwise `null`.*/
function doDuring(fn, test, callback) {callback = onlyOnce(callback || noop);var _fn = wrapAsync(fn);var _test = wrapAsync(test);function next(err/*, ...args*/) {if (err) return callback(err);var args = slice(arguments, 1);args.push(check);_test.apply(this, args);}function check(err, truth) {if (err) return callback(err);if (!truth) return callback(null);_fn(next);}check(null, true);}/*** The post-check version of [`whilst`]{@link module:ControlFlow.whilst}. To reflect the difference in* the order of operations, the arguments `test` and `iteratee` are switched.** `doWhilst` is to `whilst` as `do while` is to `while` in plain JavaScript.** @name doWhilst* @static* @memberOf module:ControlFlow* @method* @see [async.whilst]{@link module:ControlFlow.whilst}* @category Control Flow* @param {AsyncFunction} iteratee - A function which is called each time `test`* passes. Invoked with (callback).* @param {Function} test - synchronous truth test to perform after each* execution of `iteratee`. Invoked with any non-error callback results of* `iteratee`.* @param {Function} [callback] - A callback which is called after the test* function has failed and repeated execution of `iteratee` has stopped.* `callback` will be passed an error and any arguments passed to the final* `iteratee`'s callback. Invoked with (err, [results]);*/
function doWhilst(iteratee, test, callback) {callback = onlyOnce(callback || noop);var _iteratee = wrapAsync(iteratee);var next = function(err/*, ...args*/) {if (err) return callback(err);var args = slice(arguments, 1);if (test.apply(this, args)) return _iteratee(next);callback.apply(null, [null].concat(args));};_iteratee(next);
}/*** Like ['doWhilst']{@link module:ControlFlow.doWhilst}, except the `test` is inverted. Note the* argument ordering differs from `until`.** @name doUntil* @static* @memberOf module:ControlFlow* @method* @see [async.doWhilst]{@link module:ControlFlow.doWhilst}* @category Control Flow* @param {AsyncFunction} iteratee - An async function which is called each time* `test` fails. Invoked with (callback).* @param {Function} test - synchronous truth test to perform after each* execution of `iteratee`. Invoked with any non-error callback results of* `iteratee`.* @param {Function} [callback] - A callback which is called after the test* function has passed and repeated execution of `iteratee` has stopped. `callback`* will be passed an error and any arguments passed to the final `iteratee`'s* callback. Invoked with (err, [results]);*/
function doUntil(iteratee, test, callback) {doWhilst(iteratee, function() {return !test.apply(this, arguments);}, callback);
}/*** Like [`whilst`]{@link module:ControlFlow.whilst}, except the `test` is an asynchronous function that* is passed a callback in the form of `function (err, truth)`. If error is* passed to `test` or `fn`, the main callback is immediately called with the* value of the error.** @name during* @static* @memberOf module:ControlFlow* @method* @see [async.whilst]{@link module:ControlFlow.whilst}* @category Control Flow* @param {AsyncFunction} test - asynchronous truth test to perform before each* execution of `fn`. Invoked with (callback).* @param {AsyncFunction} fn - An async function which is called each time* `test` passes. Invoked with (callback).* @param {Function} [callback] - A callback which is called after the test* function has failed and repeated execution of `fn` has stopped. `callback`* will be passed an error, if one occurred, otherwise `null`.* @example** var count = 0;** async.during(*     function (callback) {*         return callback(null, count < 5);*     },*     function (callback) {*         count++;*         setTimeout(callback, 1000);*     },*     function (err) {*         // 5 seconds have passed*     }* );*/
function during(test, fn, callback) {callback = onlyOnce(callback || noop);var _fn = wrapAsync(fn);var _test = wrapAsync(test);function next(err) {if (err) return callback(err);_test(check);}function check(err, truth) {if (err) return callback(err);if (!truth) return callback(null);_fn(next);}_test(check);
}function _withoutIndex(iteratee) {return function (value, index, callback) {return iteratee(value, callback);};
}/*** Applies the function `iteratee` to each item in `coll`, in parallel.* The `iteratee` is called with an item from the list, and a callback for when* it has finished. If the `iteratee` passes an error to its `callback`, the* main `callback` (for the `each` function) is immediately called with the* error.** Note, that since this function applies `iteratee` to each item in parallel,* there is no guarantee that the iteratee functions will complete in order.** @name each* @static* @memberOf module:Collections* @method* @alias forEach* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {AsyncFunction} iteratee - An async function to apply to* each item in `coll`. Invoked with (item, callback).* The array index is not passed to the iteratee.* If you need the index, use `eachOf`.* @param {Function} [callback] - A callback which is called when all* `iteratee` functions have finished, or an error occurs. Invoked with (err).* @example** // assuming openFiles is an array of file names and saveFile is a function* // to save the modified contents of that file:** async.each(openFiles, saveFile, function(err){*   // if any of the saves produced an error, err would equal that error* });** // assuming openFiles is an array of file names* async.each(openFiles, function(file, callback) {**     // Perform operation on file here.*     console.log('Processing file ' + file);**     if( file.length > 32 ) {*       console.log('This file name is too long');*       callback('File name too long');*     } else {*       // Do work to process file here*       console.log('File processed');*       callback();*     }* }, function(err) {*     // if any of the file processing produced an error, err would equal that error*     if( err ) {*       // One of the iterations produced an error.*       // All processing will now stop.*       console.log('A file failed to process');*     } else {*       console.log('All files have been processed successfully');*     }* });*/
function eachLimit(coll, iteratee, callback) {eachOf(coll, _withoutIndex(wrapAsync(iteratee)), callback);
}/*** The same as [`each`]{@link module:Collections.each} but runs a maximum of `limit` async operations at a time.** @name eachLimit* @static* @memberOf module:Collections* @method* @see [async.each]{@link module:Collections.each}* @alias forEachLimit* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {number} limit - The maximum number of async operations at a time.* @param {AsyncFunction} iteratee - An async function to apply to each item in* `coll`.* The array index is not passed to the iteratee.* If you need the index, use `eachOfLimit`.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called when all* `iteratee` functions have finished, or an error occurs. Invoked with (err).*/
function eachLimit$1(coll, limit, iteratee, callback) {_eachOfLimit(limit)(coll, _withoutIndex(wrapAsync(iteratee)), callback);
}/*** The same as [`each`]{@link module:Collections.each} but runs only a single async operation at a time.** @name eachSeries* @static* @memberOf module:Collections* @method* @see [async.each]{@link module:Collections.each}* @alias forEachSeries* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {AsyncFunction} iteratee - An async function to apply to each* item in `coll`.* The array index is not passed to the iteratee.* If you need the index, use `eachOfSeries`.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called when all* `iteratee` functions have finished, or an error occurs. Invoked with (err).*/
var eachSeries = doLimit(eachLimit$1, 1);/*** Wrap an async function and ensure it calls its callback on a later tick of* the event loop.  If the function already calls its callback on a next tick,* no extra deferral is added. This is useful for preventing stack overflows* (`RangeError: Maximum call stack size exceeded`) and generally keeping* [Zalgo](http://blog.izs.me/post/59142742143/designing-apis-for-asynchrony)* contained. ES2017 `async` functions are returned as-is -- they are immune* to Zalgo's corrupting influences, as they always resolve on a later tick.** @name ensureAsync* @static* @memberOf module:Utils* @method* @category Util* @param {AsyncFunction} fn - an async function, one that expects a node-style* callback as its last argument.* @returns {AsyncFunction} Returns a wrapped function with the exact same call* signature as the function passed in.* @example** function sometimesAsync(arg, callback) {*     if (cache[arg]) {*         return callback(null, cache[arg]); // this would be synchronous!!*     } else {*         doSomeIO(arg, callback); // this IO would be asynchronous*     }* }** // this has a risk of stack overflows if many results are cached in a row* async.mapSeries(args, sometimesAsync, done);** // this will defer sometimesAsync's callback if necessary,* // preventing stack overflows* async.mapSeries(args, async.ensureAsync(sometimesAsync), done);*/
function ensureAsync(fn) {if (isAsync(fn)) return fn;return initialParams(function (args, callback) {var sync = true;args.push(function () {var innerArgs = arguments;if (sync) {setImmediate$1(function () {callback.apply(null, innerArgs);});} else {callback.apply(null, innerArgs);}});fn.apply(this, args);sync = false;});
}function notId(v) {return !v;
}/*** Returns `true` if every element in `coll` satisfies an async test. If any* iteratee call returns `false`, the main `callback` is immediately called.** @name every* @static* @memberOf module:Collections* @method* @alias all* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {AsyncFunction} iteratee - An async truth test to apply to each item* in the collection in parallel.* The iteratee must complete with a boolean result value.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called after all the* `iteratee` functions have finished. Result will be either `true` or `false`* depending on the values of the async tests. Invoked with (err, result).* @example** async.every(['file1','file2','file3'], function(filePath, callback) {*     fs.access(filePath, function(err) {*         callback(null, !err)*     });* }, function(err, result) {*     // if result is true then every file exists* });*/
var every = doParallel(_createTester(notId, notId));/*** The same as [`every`]{@link module:Collections.every} but runs a maximum of `limit` async operations at a time.** @name everyLimit* @static* @memberOf module:Collections* @method* @see [async.every]{@link module:Collections.every}* @alias allLimit* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {number} limit - The maximum number of async operations at a time.* @param {AsyncFunction} iteratee - An async truth test to apply to each item* in the collection in parallel.* The iteratee must complete with a boolean result value.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called after all the* `iteratee` functions have finished. Result will be either `true` or `false`* depending on the values of the async tests. Invoked with (err, result).*/
var everyLimit = doParallelLimit(_createTester(notId, notId));/*** The same as [`every`]{@link module:Collections.every} but runs only a single async operation at a time.** @name everySeries* @static* @memberOf module:Collections* @method* @see [async.every]{@link module:Collections.every}* @alias allSeries* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {AsyncFunction} iteratee - An async truth test to apply to each item* in the collection in series.* The iteratee must complete with a boolean result value.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called after all the* `iteratee` functions have finished. Result will be either `true` or `false`* depending on the values of the async tests. Invoked with (err, result).*/
var everySeries = doLimit(everyLimit, 1);/*** The base implementation of `_.property` without support for deep paths.** @private* @param {string} key The key of the property to get.* @returns {Function} Returns the new accessor function.*/
function baseProperty(key) {return function(object) {return object == null ? undefined : object[key];};
}function filterArray(eachfn, arr, iteratee, callback) {var truthValues = new Array(arr.length);eachfn(arr, function (x, index, callback) {iteratee(x, function (err, v) {truthValues[index] = !!v;callback(err);});}, function (err) {if (err) return callback(err);var results = [];for (var i = 0; i < arr.length; i++) {if (truthValues[i]) results.push(arr[i]);}callback(null, results);});
}function filterGeneric(eachfn, coll, iteratee, callback) {var results = [];eachfn(coll, function (x, index, callback) {iteratee(x, function (err, v) {if (err) {callback(err);} else {if (v) {results.push({index: index, value: x});}callback();}});}, function (err) {if (err) {callback(err);} else {callback(null, arrayMap(results.sort(function (a, b) {return a.index - b.index;}), baseProperty('value')));}});
}function _filter(eachfn, coll, iteratee, callback) {var filter = isArrayLike(coll) ? filterArray : filterGeneric;filter(eachfn, coll, wrapAsync(iteratee), callback || noop);
}/*** Returns a new array of all the values in `coll` which pass an async truth* test. This operation is performed in parallel, but the results array will be* in the same order as the original.** @name filter* @static* @memberOf module:Collections* @method* @alias select* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {Function} iteratee - A truth test to apply to each item in `coll`.* The `iteratee` is passed a `callback(err, truthValue)`, which must be called* with a boolean argument once it has completed. Invoked with (item, callback).* @param {Function} [callback] - A callback which is called after all the* `iteratee` functions have finished. Invoked with (err, results).* @example** async.filter(['file1','file2','file3'], function(filePath, callback) {*     fs.access(filePath, function(err) {*         callback(null, !err)*     });* }, function(err, results) {*     // results now equals an array of the existing files* });*/
var filter = doParallel(_filter);/*** The same as [`filter`]{@link module:Collections.filter} but runs a maximum of `limit` async operations at a* time.** @name filterLimit* @static* @memberOf module:Collections* @method* @see [async.filter]{@link module:Collections.filter}* @alias selectLimit* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {number} limit - The maximum number of async operations at a time.* @param {Function} iteratee - A truth test to apply to each item in `coll`.* The `iteratee` is passed a `callback(err, truthValue)`, which must be called* with a boolean argument once it has completed. Invoked with (item, callback).* @param {Function} [callback] - A callback which is called after all the* `iteratee` functions have finished. Invoked with (err, results).*/
var filterLimit = doParallelLimit(_filter);/*** The same as [`filter`]{@link module:Collections.filter} but runs only a single async operation at a time.** @name filterSeries* @static* @memberOf module:Collections* @method* @see [async.filter]{@link module:Collections.filter}* @alias selectSeries* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {Function} iteratee - A truth test to apply to each item in `coll`.* The `iteratee` is passed a `callback(err, truthValue)`, which must be called* with a boolean argument once it has completed. Invoked with (item, callback).* @param {Function} [callback] - A callback which is called after all the* `iteratee` functions have finished. Invoked with (err, results)*/
var filterSeries = doLimit(filterLimit, 1);/*** Calls the asynchronous function `fn` with a callback parameter that allows it* to call itself again, in series, indefinitely.* If an error is passed to the callback then `errback` is called with the* error, and execution stops, otherwise it will never be called.** @name forever* @static* @memberOf module:ControlFlow* @method* @category Control Flow* @param {AsyncFunction} fn - an async function to call repeatedly.* Invoked with (next).* @param {Function} [errback] - when `fn` passes an error to it's callback,* this function will be called, and execution stops. Invoked with (err).* @example** async.forever(*     function(next) {*         // next is suitable for passing to things that need a callback(err [, whatever]);*         // it will result in this function being called again.*     },*     function(err) {*         // if next is called with a value in its first parameter, it will appear*         // in here as 'err', and execution will stop.*     }* );*/
function forever(fn, errback) {var done = onlyOnce(errback || noop);var task = wrapAsync(ensureAsync(fn));function next(err) {if (err) return done(err);task(next);}next();
}/*** The same as [`groupBy`]{@link module:Collections.groupBy} but runs a maximum of `limit` async operations at a time.** @name groupByLimit* @static* @memberOf module:Collections* @method* @see [async.groupBy]{@link module:Collections.groupBy}* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {number} limit - The maximum number of async operations at a time.* @param {AsyncFunction} iteratee - An async function to apply to each item in* `coll`.* The iteratee should complete with a `key` to group the value under.* Invoked with (value, callback).* @param {Function} [callback] - A callback which is called when all `iteratee`* functions have finished, or an error occurs. Result is an `Object` whoses* properties are arrays of values which returned the corresponding key.*/
var groupByLimit = function(coll, limit, iteratee, callback) {callback = callback || noop;var _iteratee = wrapAsync(iteratee);mapLimit(coll, limit, function(val, callback) {_iteratee(val, function(err, key) {if (err) return callback(err);return callback(null, {key: key, val: val});});}, function(err, mapResults) {var result = {};// from MDN, handle object having an `hasOwnProperty` propvar hasOwnProperty = Object.prototype.hasOwnProperty;for (var i = 0; i < mapResults.length; i++) {if (mapResults[i]) {var key = mapResults[i].key;var val = mapResults[i].val;if (hasOwnProperty.call(result, key)) {result[key].push(val);} else {result[key] = [val];}}}return callback(err, result);});
};/*** Returns a new object, where each value corresponds to an array of items, from* `coll`, that returned the corresponding key. That is, the keys of the object* correspond to the values passed to the `iteratee` callback.** Note: Since this function applies the `iteratee` to each item in parallel,* there is no guarantee that the `iteratee` functions will complete in order.* However, the values for each key in the `result` will be in the same order as* the original `coll`. For Objects, the values will roughly be in the order of* the original Objects' keys (but this can vary across JavaScript engines).** @name groupBy* @static* @memberOf module:Collections* @method* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {AsyncFunction} iteratee - An async function to apply to each item in* `coll`.* The iteratee should complete with a `key` to group the value under.* Invoked with (value, callback).* @param {Function} [callback] - A callback which is called when all `iteratee`* functions have finished, or an error occurs. Result is an `Object` whoses* properties are arrays of values which returned the corresponding key.* @example** async.groupBy(['userId1', 'userId2', 'userId3'], function(userId, callback) {*     db.findById(userId, function(err, user) {*         if (err) return callback(err);*         return callback(null, user.age);*     });* }, function(err, result) {*     // result is object containing the userIds grouped by age*     // e.g. { 30: ['userId1', 'userId3'], 42: ['userId2']};* });*/
var groupBy = doLimit(groupByLimit, Infinity);/*** The same as [`groupBy`]{@link module:Collections.groupBy} but runs only a single async operation at a time.** @name groupBySeries* @static* @memberOf module:Collections* @method* @see [async.groupBy]{@link module:Collections.groupBy}* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {number} limit - The maximum number of async operations at a time.* @param {AsyncFunction} iteratee - An async function to apply to each item in* `coll`.* The iteratee should complete with a `key` to group the value under.* Invoked with (value, callback).* @param {Function} [callback] - A callback which is called when all `iteratee`* functions have finished, or an error occurs. Result is an `Object` whoses* properties are arrays of values which returned the corresponding key.*/
var groupBySeries = doLimit(groupByLimit, 1);/*** Logs the result of an `async` function to the `console`. Only works in* Node.js or in browsers that support `console.log` and `console.error` (such* as FF and Chrome). If multiple arguments are returned from the async* function, `console.log` is called on each argument in order.** @name log* @static* @memberOf module:Utils* @method* @category Util* @param {AsyncFunction} function - The function you want to eventually apply* all arguments to.* @param {...*} arguments... - Any number of arguments to apply to the function.* @example** // in a module* var hello = function(name, callback) {*     setTimeout(function() {*         callback(null, 'hello ' + name);*     }, 1000);* };** // in the node repl* node> async.log(hello, 'world');* 'hello world'*/
var log = consoleFunc('log');/*** The same as [`mapValues`]{@link module:Collections.mapValues} but runs a maximum of `limit` async operations at a* time.** @name mapValuesLimit* @static* @memberOf module:Collections* @method* @see [async.mapValues]{@link module:Collections.mapValues}* @category Collection* @param {Object} obj - A collection to iterate over.* @param {number} limit - The maximum number of async operations at a time.* @param {AsyncFunction} iteratee - A function to apply to each value and key* in `coll`.* The iteratee should complete with the transformed value as its result.* Invoked with (value, key, callback).* @param {Function} [callback] - A callback which is called when all `iteratee`* functions have finished, or an error occurs. `result` is a new object consisting* of each key from `obj`, with each transformed value on the right-hand side.* Invoked with (err, result).*/
function mapValuesLimit(obj, limit, iteratee, callback) {callback = once(callback || noop);var newObj = {};var _iteratee = wrapAsync(iteratee);eachOfLimit(obj, limit, function(val, key, next) {_iteratee(val, key, function (err, result) {if (err) return next(err);newObj[key] = result;next();});}, function (err) {callback(err, newObj);});
}/*** A relative of [`map`]{@link module:Collections.map}, designed for use with objects.** Produces a new Object by mapping each value of `obj` through the `iteratee`* function. The `iteratee` is called each `value` and `key` from `obj` and a* callback for when it has finished processing. Each of these callbacks takes* two arguments: an `error`, and the transformed item from `obj`. If `iteratee`* passes an error to its callback, the main `callback` (for the `mapValues`* function) is immediately called with the error.** Note, the order of the keys in the result is not guaranteed.  The keys will* be roughly in the order they complete, (but this is very engine-specific)** @name mapValues* @static* @memberOf module:Collections* @method* @category Collection* @param {Object} obj - A collection to iterate over.* @param {AsyncFunction} iteratee - A function to apply to each value and key* in `coll`.* The iteratee should complete with the transformed value as its result.* Invoked with (value, key, callback).* @param {Function} [callback] - A callback which is called when all `iteratee`* functions have finished, or an error occurs. `result` is a new object consisting* of each key from `obj`, with each transformed value on the right-hand side.* Invoked with (err, result).* @example** async.mapValues({*     f1: 'file1',*     f2: 'file2',*     f3: 'file3'* }, function (file, key, callback) {*   fs.stat(file, callback);* }, function(err, result) {*     // result is now a map of stats for each file, e.g.*     // {*     //     f1: [stats for file1],*     //     f2: [stats for file2],*     //     f3: [stats for file3]*     // }* });*/var mapValues = doLimit(mapValuesLimit, Infinity);/*** The same as [`mapValues`]{@link module:Collections.mapValues} but runs only a single async operation at a time.** @name mapValuesSeries* @static* @memberOf module:Collections* @method* @see [async.mapValues]{@link module:Collections.mapValues}* @category Collection* @param {Object} obj - A collection to iterate over.* @param {AsyncFunction} iteratee - A function to apply to each value and key* in `coll`.* The iteratee should complete with the transformed value as its result.* Invoked with (value, key, callback).* @param {Function} [callback] - A callback which is called when all `iteratee`* functions have finished, or an error occurs. `result` is a new object consisting* of each key from `obj`, with each transformed value on the right-hand side.* Invoked with (err, result).*/
var mapValuesSeries = doLimit(mapValuesLimit, 1);function has(obj, key) {return key in obj;
}/*** Caches the results of an async function. When creating a hash to store* function results against, the callback is omitted from the hash and an* optional hash function can be used.** If no hash function is specified, the first argument is used as a hash key,* which may work reasonably if it is a string or a data type that converts to a* distinct string. Note that objects and arrays will not behave reasonably.* Neither will cases where the other arguments are significant. In such cases,* specify your own hash function.** The cache of results is exposed as the `memo` property of the function* returned by `memoize`.** @name memoize* @static* @memberOf module:Utils* @method* @category Util* @param {AsyncFunction} fn - The async function to proxy and cache results from.* @param {Function} hasher - An optional function for generating a custom hash* for storing results. It has all the arguments applied to it apart from the* callback, and must be synchronous.* @returns {AsyncFunction} a memoized version of `fn`* @example** var slow_fn = function(name, callback) {*     // do something*     callback(null, result);* };* var fn = async.memoize(slow_fn);** // fn can now be used as if it were slow_fn* fn('some name', function() {*     // callback* });*/
function memoize(fn, hasher) {var memo = Object.create(null);var queues = Object.create(null);hasher = hasher || identity;var _fn = wrapAsync(fn);var memoized = initialParams(function memoized(args, callback) {var key = hasher.apply(null, args);if (has(memo, key)) {setImmediate$1(function() {callback.apply(null, memo[key]);});} else if (has(queues, key)) {queues[key].push(callback);} else {queues[key] = [callback];_fn.apply(null, args.concat(function(/*args*/) {var args = slice(arguments);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;
}/*** Calls `callback` on a later loop around the event loop. In Node.js this just* calls `setImmediate`.  In the browser it will use `setImmediate` if* available, otherwise `setTimeout(callback, 0)`, which means other higher* priority events may precede the execution of `callback`.** This is used internally for browser-compatibility purposes.** @name nextTick* @static* @memberOf module:Utils* @method* @alias setImmediate* @category Util* @param {Function} callback - The function to call on a later loop around* the event loop. Invoked with (args...).* @param {...*} args... - any number of additional arguments to pass to the* callback on the next tick.* @example** var call_order = [];* async.nextTick(function() {*     call_order.push('two');*     // call_order now equals ['one','two']* });* call_order.push('one');** async.setImmediate(function (a, b, c) {*     // a, b, and c equal 1, 2, and 3* }, 1, 2, 3);*/
var _defer$1;if (hasNextTick) {_defer$1 = process.nextTick;
} else if (hasSetImmediate) {_defer$1 = setImmediate;
} else {_defer$1 = fallback;
}var nextTick = wrap(_defer$1);function _parallel(eachfn, tasks, callback) {callback = callback || noop;var results = isArrayLike(tasks) ? [] : {};eachfn(tasks, function (task, key, callback) {wrapAsync(task)(function (err, result) {if (arguments.length > 2) {result = slice(arguments, 1);}results[key] = result;callback(err);});}, function (err) {callback(err, results);});
}/*** Run the `tasks` collection of functions in parallel, without waiting until* the previous function has completed. If any of the functions pass an error to* its callback, the main `callback` is immediately called with the value of the* error. Once the `tasks` have completed, the results are passed to the final* `callback` as an array.** **Note:** `parallel` is about kicking-off I/O tasks in parallel, not about* parallel execution of code.  If your tasks do not use any timers or perform* any I/O, they will actually be executed in series.  Any synchronous setup* sections for each task will happen one after the other.  JavaScript remains* single-threaded.** **Hint:** Use [`reflect`]{@link module:Utils.reflect} to continue the* execution of other tasks when a task fails.** It is also possible to use an object instead of an array. Each property will* be run as a function and the results will be passed to the final `callback`* as an object instead of an array. This can be a more readable way of handling* results from {@link async.parallel}.** @name parallel* @static* @memberOf module:ControlFlow* @method* @category Control Flow* @param {Array|Iterable|Object} tasks - A collection of* [async functions]{@link AsyncFunction} to run.* Each async function can complete with any number of optional `result` values.* @param {Function} [callback] - An optional callback to run once all the* functions have completed successfully. This function gets a results array* (or object) containing all the result arguments passed to the task callbacks.* Invoked with (err, results).** @example* async.parallel([*     function(callback) {*         setTimeout(function() {*             callback(null, 'one');*         }, 200);*     },*     function(callback) {*         setTimeout(function() {*             callback(null, 'two');*         }, 100);*     }* ],* // optional callback* function(err, results) {*     // the results array will equal ['one','two'] even though*     // the second function had a shorter timeout.* });** // an example using an object instead of an array* async.parallel({*     one: function(callback) {*         setTimeout(function() {*             callback(null, 1);*         }, 200);*     },*     two: function(callback) {*         setTimeout(function() {*             callback(null, 2);*         }, 100);*     }* }, function(err, results) {*     // results is now equals to: {one: 1, two: 2}* });*/
function parallelLimit(tasks, callback) {_parallel(eachOf, tasks, callback);
}/*** The same as [`parallel`]{@link module:ControlFlow.parallel} but runs a maximum of `limit` async operations at a* time.** @name parallelLimit* @static* @memberOf module:ControlFlow* @method* @see [async.parallel]{@link module:ControlFlow.parallel}* @category Control Flow* @param {Array|Iterable|Object} tasks - A collection of* [async functions]{@link AsyncFunction} to run.* Each async function can complete with any number of optional `result` values.* @param {number} limit - The maximum number of async operations at a time.* @param {Function} [callback] - An optional callback to run once all the* functions have completed successfully. This function gets a results array* (or object) containing all the result arguments passed to the task callbacks.* Invoked with (err, results).*/
function parallelLimit$1(tasks, limit, callback) {_parallel(_eachOfLimit(limit), tasks, callback);
}/*** A queue of tasks for the worker function to complete.* @typedef {Object} QueueObject* @memberOf module:ControlFlow* @property {Function} length - a function returning the number of items* waiting to be processed. Invoke with `queue.length()`.* @property {boolean} started - a boolean indicating whether or not any* items have been pushed and processed by the queue.* @property {Function} running - a function returning the number of items* currently being processed. Invoke with `queue.running()`.* @property {Function} workersList - a function returning the array of items* currently being processed. Invoke with `queue.workersList()`.* @property {Function} idle - a function returning false if there are items* waiting or being processed, or true if not. Invoke with `queue.idle()`.* @property {number} concurrency - an integer for determining how many `worker`* functions should be run in parallel. This property can be changed after a* `queue` is created to alter the concurrency on-the-fly.* @property {Function} push - add a new task to the `queue`. Calls `callback`* once the `worker` has finished processing the task. Instead of a single task,* a `tasks` array can be submitted. The respective callback is used for every* task in the list. Invoke with `queue.push(task, [callback])`,* @property {Function} unshift - add a new task to the front of the `queue`.* Invoke with `queue.unshift(task, [callback])`.* @property {Function} remove - remove items from the queue that match a test* function.  The test function will be passed an object with a `data` property,* and a `priority` property, if this is a* [priorityQueue]{@link module:ControlFlow.priorityQueue} object.* Invoked with `queue.remove(testFn)`, where `testFn` is of the form* `function ({data, priority}) {}` and returns a Boolean.* @property {Function} saturated - a callback that is called when the number of* running workers hits the `concurrency` limit, and further tasks will be* queued.* @property {Function} unsaturated - a callback that is called when the number* of running workers is less than the `concurrency` & `buffer` limits, and* further tasks will not be queued.* @property {number} buffer - A minimum threshold buffer in order to say that* the `queue` is `unsaturated`.* @property {Function} empty - a callback that is called when the last item* from the `queue` is given to a `worker`.* @property {Function} drain - a callback that is called when the last item* from the `queue` has returned from the `worker`.* @property {Function} error - a callback that is called when a task errors.* Has the signature `function(error, task)`.* @property {boolean} paused - a boolean for determining whether the queue is* in a paused state.* @property {Function} pause - a function that pauses the processing of tasks* until `resume()` is called. Invoke with `queue.pause()`.* @property {Function} resume - a function that resumes the processing of* queued tasks when the queue is paused. Invoke with `queue.resume()`.* @property {Function} kill - a function that removes the `drain` callback and* empties remaining tasks from the queue forcing it to go idle. Invoke with `queue.kill()`.*//*** Creates a `queue` object with the specified `concurrency`. Tasks added to the* `queue` are processed in parallel (up to the `concurrency` limit). If all* `worker`s are in progress, the task is queued until one becomes available.* Once a `worker` completes a `task`, that `task`'s callback is called.** @name queue* @static* @memberOf module:ControlFlow* @method* @category Control Flow* @param {AsyncFunction} worker - An async function for processing a queued task.* If you want to handle errors from an individual task, pass a callback to* `q.push()`. Invoked with (task, callback).* @param {number} [concurrency=1] - An `integer` for determining how many* `worker` functions should be run in parallel.  If omitted, the concurrency* defaults to `1`.  If the concurrency is `0`, an error is thrown.* @returns {module:ControlFlow.QueueObject} A queue object to manage the tasks. Callbacks can* attached as certain properties to listen for specific events during the* lifecycle of the queue.* @example** // create a queue object with concurrency 2* var q = async.queue(function(task, callback) {*     console.log('hello ' + task.name);*     callback();* }, 2);** // assign a callback* q.drain = function() {*     console.log('all items have been processed');* };** // add some items to the queue* q.push({name: 'foo'}, function(err) {*     console.log('finished processing foo');* });* q.push({name: 'bar'}, function (err) {*     console.log('finished processing bar');* });** // add some items to the queue (batch-wise)* q.push([{name: 'baz'},{name: 'bay'},{name: 'bax'}], function(err) {*     console.log('finished processing item');* });** // add some items to the front of the queue* q.unshift({name: 'bar'}, function (err) {*     console.log('finished processing bar');* });*/
var queue$1 = function (worker, concurrency) {var _worker = wrapAsync(worker);return queue(function (items, cb) {_worker(items[0], cb);}, concurrency, 1);
};/*** The same as [async.queue]{@link module:ControlFlow.queue} only tasks are assigned a priority and* completed in ascending priority order.** @name priorityQueue* @static* @memberOf module:ControlFlow* @method* @see [async.queue]{@link module:ControlFlow.queue}* @category Control Flow* @param {AsyncFunction} worker - An async function for processing a queued task.* If you want to handle errors from an individual task, pass a callback to* `q.push()`.* Invoked with (task, callback).* @param {number} concurrency - An `integer` for determining how many `worker`* functions should be run in parallel.  If omitted, the concurrency defaults to* `1`.  If the concurrency is `0`, an error is thrown.* @returns {module:ControlFlow.QueueObject} A priorityQueue object to manage the tasks. There are two* differences between `queue` and `priorityQueue` objects:* * `push(task, priority, [callback])` - `priority` should be a number. If an*   array of `tasks` is given, all tasks will be assigned the same priority.* * The `unshift` method was removed.*/
var priorityQueue = function(worker, concurrency) {// Start with a normal queuevar q = queue$1(worker, concurrency);// Override push to accept second parameter representing priorityq.push = function(data, priority, callback) {if (callback == null) callback = noop;if (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 tasksreturn setImmediate$1(function() {q.drain();});}priority = priority || 0;var nextNode = q._tasks.head;while (nextNode && priority >= nextNode.priority) {nextNode = nextNode.next;}for (var i = 0, l = data.length; i < l; i++) {var item = {data: data[i],priority: priority,callback: callback};if (nextNode) {q._tasks.insertBefore(nextNode, item);} else {q._tasks.push(item);}}setImmediate$1(q.process);};// Remove unshift functiondelete q.unshift;return q;
};/*** Runs the `tasks` array of functions in parallel, without waiting until the* previous function has completed. Once any of the `tasks` complete or pass an* error to its callback, the main `callback` is immediately called. It's* equivalent to `Promise.race()`.** @name race* @static* @memberOf module:ControlFlow* @method* @category Control Flow* @param {Array} tasks - An array containing [async functions]{@link AsyncFunction}* to run. Each function can complete with an optional `result` value.* @param {Function} callback - A callback to run once any of the functions have* completed. This function gets an error or result from the first function that* completed. Invoked with (err, result).* @returns undefined* @example** async.race([*     function(callback) {*         setTimeout(function() {*             callback(null, 'one');*         }, 200);*     },*     function(callback) {*         setTimeout(function() {*             callback(null, 'two');*         }, 100);*     }* ],* // main callback* function(err, result) {*     // the result will be equal to 'two' as it finishes earlier* });*/
function race(tasks, callback) {callback = once(callback || noop);if (!isArray(tasks)) return callback(new TypeError('First argument to race must be an array of functions'));if (!tasks.length) return callback();for (var i = 0, l = tasks.length; i < l; i++) {wrapAsync(tasks[i])(callback);}
}/*** Same as [`reduce`]{@link module:Collections.reduce}, only operates on `array` in reverse order.** @name reduceRight* @static* @memberOf module:Collections* @method* @see [async.reduce]{@link module:Collections.reduce}* @alias foldr* @category Collection* @param {Array} array - A collection to iterate over.* @param {*} memo - The initial state of the reduction.* @param {AsyncFunction} iteratee - A function applied to each item in the* array to produce the next step in the reduction.* The `iteratee` should complete with the next state of the reduction.* If the iteratee complete with an error, the reduction is stopped and the* main `callback` is immediately called with the error.* Invoked with (memo, item, callback).* @param {Function} [callback] - A callback which is called after all the* `iteratee` functions have finished. Result is the reduced value. Invoked with* (err, result).*/
function reduceRight (array, memo, iteratee, callback) {var reversed = slice(array).reverse();reduce(reversed, memo, iteratee, callback);
}/*** Wraps the async function in another function that always completes with a* result object, even when it errors.** The result object has either the property `error` or `value`.** @name reflect* @static* @memberOf module:Utils* @method* @category Util* @param {AsyncFunction} fn - The async function you want to wrap* @returns {Function} - A function that always passes null to it's callback as* the error. The second argument to the callback will be an `object` with* either an `error` or a `value` property.* @example** async.parallel([*     async.reflect(function(callback) {*         // do some stuff ...*         callback(null, 'one');*     }),*     async.reflect(function(callback) {*         // do some more stuff but error ...*         callback('bad stuff happened');*     }),*     async.reflect(function(callback) {*         // do some more stuff ...*         callback(null, 'two');*     })* ],* // optional callback* function(err, results) {*     // values*     // results[0].value = 'one'*     // results[1].error = 'bad stuff happened'*     // results[2].value = 'two'* });*/
function reflect(fn) {var _fn = wrapAsync(fn);return initialParams(function reflectOn(args, reflectCallback) {args.push(function callback(error, cbArg) {if (error) {reflectCallback(null, { error: error });} else {var value;if (arguments.length <= 2) {value = cbArg;} else {value = slice(arguments, 1);}reflectCallback(null, { value: value });}});return _fn.apply(this, args);});
}function reject$1(eachfn, arr, iteratee, callback) {_filter(eachfn, arr, function(value, cb) {iteratee(value, function(err, v) {cb(err, !v);});}, callback);
}/*** The opposite of [`filter`]{@link module:Collections.filter}. Removes values that pass an `async` truth test.** @name reject* @static* @memberOf module:Collections* @method* @see [async.filter]{@link module:Collections.filter}* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {Function} iteratee - An async truth test to apply to each item in* `coll`.* The should complete with a boolean value as its `result`.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called after all the* `iteratee` functions have finished. Invoked with (err, results).* @example** async.reject(['file1','file2','file3'], function(filePath, callback) {*     fs.access(filePath, function(err) {*         callback(null, !err)*     });* }, function(err, results) {*     // results now equals an array of missing files*     createFiles(results);* });*/
var reject = doParallel(reject$1);/*** A helper function that wraps an array or an object of functions with `reflect`.** @name reflectAll* @static* @memberOf module:Utils* @method* @see [async.reflect]{@link module:Utils.reflect}* @category Util* @param {Array|Object|Iterable} tasks - The collection of* [async functions]{@link AsyncFunction} to wrap in `async.reflect`.* @returns {Array} Returns an array of async functions, each wrapped in* `async.reflect`* @example** let tasks = [*     function(callback) {*         setTimeout(function() {*             callback(null, 'one');*         }, 200);*     },*     function(callback) {*         // do some more stuff but error ...*         callback(new Error('bad stuff happened'));*     },*     function(callback) {*         setTimeout(function() {*             callback(null, 'two');*         }, 100);*     }* ];** async.parallel(async.reflectAll(tasks),* // optional callback* function(err, results) {*     // values*     // results[0].value = 'one'*     // results[1].error = Error('bad stuff happened')*     // results[2].value = 'two'* });** // an example using an object instead of an array* let tasks = {*     one: function(callback) {*         setTimeout(function() {*             callback(null, 'one');*         }, 200);*     },*     two: function(callback) {*         callback('two');*     },*     three: function(callback) {*         setTimeout(function() {*             callback(null, 'three');*         }, 100);*     }* };** async.parallel(async.reflectAll(tasks),* // optional callback* function(err, results) {*     // values*     // results.one.value = 'one'*     // results.two.error = 'two'*     // results.three.value = 'three'* });*/
function reflectAll(tasks) {var results;if (isArray(tasks)) {results = arrayMap(tasks, reflect);} else {results = {};baseForOwn(tasks, function(task, key) {results[key] = reflect.call(this, task);});}return results;
}/*** The same as [`reject`]{@link module:Collections.reject} but runs a maximum of `limit` async operations at a* time.** @name rejectLimit* @static* @memberOf module:Collections* @method* @see [async.reject]{@link module:Collections.reject}* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {number} limit - The maximum number of async operations at a time.* @param {Function} iteratee - An async truth test to apply to each item in* `coll`.* The should complete with a boolean value as its `result`.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called after all the* `iteratee` functions have finished. Invoked with (err, results).*/
var rejectLimit = doParallelLimit(reject$1);/*** The same as [`reject`]{@link module:Collections.reject} but runs only a single async operation at a time.** @name rejectSeries* @static* @memberOf module:Collections* @method* @see [async.reject]{@link module:Collections.reject}* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {Function} iteratee - An async truth test to apply to each item in* `coll`.* The should complete with a boolean value as its `result`.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called after all the* `iteratee` functions have finished. Invoked with (err, results).*/
var rejectSeries = doLimit(rejectLimit, 1);/*** Creates a function that returns `value`.** @static* @memberOf _* @since 2.4.0* @category Util* @param {*} value The value to return from the new function.* @returns {Function} Returns the new constant function.* @example** var objects = _.times(2, _.constant({ 'a': 1 }));** console.log(objects);* // => [{ 'a': 1 }, { 'a': 1 }]** console.log(objects[0] === objects[1]);* // => true*/
function constant$1(value) {return function() {return value;};
}/*** Attempts to get a successful response from `task` no more than `times` times* before returning an error. If the task is successful, the `callback` will be* passed the result of the successful task. If all attempts fail, the callback* will be passed the error and result (if any) of the final attempt.** @name retry* @static* @memberOf module:ControlFlow* @method* @category Control Flow* @see [async.retryable]{@link module:ControlFlow.retryable}* @param {Object|number} [opts = {times: 5, interval: 0}| 5] - Can be either an* object with `times` and `interval` or a number.* * `times` - The number of attempts to make before giving up.  The default*   is `5`.* * `interval` - The time to wait between retries, in milliseconds.  The*   default is `0`. The interval may also be specified as a function of the*   retry count (see example).* * `errorFilter` - An optional synchronous function that is invoked on*   erroneous result. If it returns `true` the retry attempts will continue;*   if the function returns `false` the retry flow is aborted with the current*   attempt's error and result being returned to the final callback.*   Invoked with (err).* * If `opts` is a number, the number specifies the number of times to retry,*   with the default interval of `0`.* @param {AsyncFunction} task - An async function to retry.* Invoked with (callback).* @param {Function} [callback] - An optional callback which is called when the* task has succeeded, or after the final failed attempt. It receives the `err`* and `result` arguments of the last attempt at completing the `task`. Invoked* with (err, results).** @example** // The `retry` function can be used as a stand-alone control flow by passing* // a callback, as shown below:** // try calling apiMethod 3 times* async.retry(3, apiMethod, function(err, result) {*     // do something with the result* });** // try calling apiMethod 3 times, waiting 200 ms between each retry* async.retry({times: 3, interval: 200}, apiMethod, function(err, result) {*     // do something with the result* });** // try calling apiMethod 10 times with exponential backoff* // (i.e. intervals of 100, 200, 400, 800, 1600, ... milliseconds)* async.retry({*   times: 10,*   interval: function(retryCount) {*     return 50 * Math.pow(2, retryCount);*   }* }, apiMethod, function(err, result) {*     // do something with the result* });** // try calling apiMethod the default 5 times no delay between each retry* async.retry(apiMethod, function(err, result) {*     // do something with the result* });** // try calling apiMethod only when error condition satisfies, all other* // errors will abort the retry control flow and return to final callback* async.retry({*   errorFilter: function(err) {*     return err.message === 'Temporary error'; // only retry on a specific error*   }* }, apiMethod, function(err, result) {*     // do something with the result* });** // It can also be embedded within other control flow functions to retry* // individual methods that are not as reliable, like this:* async.auto({*     users: api.getUsers.bind(api),*     payments: async.retryable(3, api.getPayments.bind(api))* }, function(err, results) {*     // do something with the results* });**/
function retry(opts, task, callback) {var DEFAULT_TIMES = 5;var DEFAULT_INTERVAL = 0;var options = {times: DEFAULT_TIMES,intervalFunc: constant$1(DEFAULT_INTERVAL)};function parseTimes(acc, t) {if (typeof t === 'object') {acc.times = +t.times || DEFAULT_TIMES;acc.intervalFunc = typeof t.interval === 'function' ?t.interval :constant$1(+t.interval || DEFAULT_INTERVAL);acc.errorFilter = t.errorFilter;} else if (typeof t === 'number' || typeof t === 'string') {acc.times = +t || DEFAULT_TIMES;} else {throw new Error("Invalid arguments for async.retry");}}if (arguments.length < 3 && typeof opts === 'function') {callback = task || noop;task = opts;} else {parseTimes(options, opts);callback = callback || noop;}if (typeof task !== 'function') {throw new Error("Invalid arguments for async.retry");}var _task = wrapAsync(task);var attempt = 1;function retryAttempt() {_task(function(err) {if (err && attempt++ < options.times &&(typeof options.errorFilter != 'function' ||options.errorFilter(err))) {setTimeout(retryAttempt, options.intervalFunc(attempt));} else {callback.apply(null, arguments);}});}retryAttempt();
}/*** A close relative of [`retry`]{@link module:ControlFlow.retry}.  This method* wraps a task and makes it retryable, rather than immediately calling it* with retries.** @name retryable* @static* @memberOf module:ControlFlow* @method* @see [async.retry]{@link module:ControlFlow.retry}* @category Control Flow* @param {Object|number} [opts = {times: 5, interval: 0}| 5] - optional* options, exactly the same as from `retry`* @param {AsyncFunction} task - the asynchronous function to wrap.* This function will be passed any arguments passed to the returned wrapper.* Invoked with (...args, callback).* @returns {AsyncFunction} The wrapped function, which when invoked, will* retry on an error, based on the parameters specified in `opts`.* This function will accept the same parameters as `task`.* @example** async.auto({*     dep1: async.retryable(3, getFromFlakyService),*     process: ["dep1", async.retryable(3, function (results, cb) {*         maybeProcessData(results.dep1, cb);*     })]* }, callback);*/
var retryable = function (opts, task) {if (!task) {task = opts;opts = null;}var _task = wrapAsync(task);return initialParams(function (args, callback) {function taskFn(cb) {_task.apply(null, args.concat(cb));}if (opts) retry(opts, taskFn, callback);else retry(taskFn, callback);});
};/*** Run the functions in the `tasks` collection in series, each one running once* the previous function has completed. If any functions in the series pass an* error to its callback, no more functions are run, and `callback` is* immediately called with the value of the error. Otherwise, `callback`* receives an array of results when `tasks` have completed.** It is also possible to use an object instead of an array. Each property will* be run as a function, and the results will be passed to the final `callback`* as an object instead of an array. This can be a more readable way of handling*  results from {@link async.series}.** **Note** that while many implementations preserve the order of object* properties, the [ECMAScript Language Specification](http://www.ecma-international.org/ecma-262/5.1/#sec-8.6)* explicitly states that** > The mechanics and order of enumerating the properties is not specified.** So if you rely on the order in which your series of functions are executed,* and want this to work on all platforms, consider using an array.** @name series* @static* @memberOf module:ControlFlow* @method* @category Control Flow* @param {Array|Iterable|Object} tasks - A collection containing* [async functions]{@link AsyncFunction} to run in series.* Each function can complete with any number of optional `result` values.* @param {Function} [callback] - An optional callback to run once all the* functions have completed. This function gets a results array (or object)* containing all the result arguments passed to the `task` callbacks. Invoked* with (err, result).* @example* async.series([*     function(callback) {*         // do some stuff ...*         callback(null, 'one');*     },*     function(callback) {*         // do some more stuff ...*         callback(null, 'two');*     }* ],* // optional callback* function(err, results) {*     // results is now equal to ['one', 'two']* });** async.series({*     one: function(callback) {*         setTimeout(function() {*             callback(null, 1);*         }, 200);*     },*     two: function(callback){*         setTimeout(function() {*             callback(null, 2);*         }, 100);*     }* }, function(err, results) {*     // results is now equal to: {one: 1, two: 2}* });*/
function series(tasks, callback) {_parallel(eachOfSeries, tasks, callback);
}/*** Returns `true` if at least one element in the `coll` satisfies an async test.* If any iteratee call returns `true`, the main `callback` is immediately* called.** @name some* @static* @memberOf module:Collections* @method* @alias any* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {AsyncFunction} iteratee - An async truth test to apply to each item* in the collections in parallel.* The iteratee should complete with a boolean `result` value.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called as soon as any* iteratee returns `true`, or after all the iteratee functions have finished.* Result will be either `true` or `false` depending on the values of the async* tests. Invoked with (err, result).* @example** async.some(['file1','file2','file3'], function(filePath, callback) {*     fs.access(filePath, function(err) {*         callback(null, !err)*     });* }, function(err, result) {*     // if result is true then at least one of the files exists* });*/
var some = doParallel(_createTester(Boolean, identity));/*** The same as [`some`]{@link module:Collections.some} but runs a maximum of `limit` async operations at a time.** @name someLimit* @static* @memberOf module:Collections* @method* @see [async.some]{@link module:Collections.some}* @alias anyLimit* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {number} limit - The maximum number of async operations at a time.* @param {AsyncFunction} iteratee - An async truth test to apply to each item* in the collections in parallel.* The iteratee should complete with a boolean `result` value.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called as soon as any* iteratee returns `true`, or after all the iteratee functions have finished.* Result will be either `true` or `false` depending on the values of the async* tests. Invoked with (err, result).*/
var someLimit = doParallelLimit(_createTester(Boolean, identity));/*** The same as [`some`]{@link module:Collections.some} but runs only a single async operation at a time.** @name someSeries* @static* @memberOf module:Collections* @method* @see [async.some]{@link module:Collections.some}* @alias anySeries* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {AsyncFunction} iteratee - An async truth test to apply to each item* in the collections in series.* The iteratee should complete with a boolean `result` value.* Invoked with (item, callback).* @param {Function} [callback] - A callback which is called as soon as any* iteratee returns `true`, or after all the iteratee functions have finished.* Result will be either `true` or `false` depending on the values of the async* tests. Invoked with (err, result).*/
var someSeries = doLimit(someLimit, 1);/*** Sorts a list by the results of running each `coll` value through an async* `iteratee`.** @name sortBy* @static* @memberOf module:Collections* @method* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {AsyncFunction} iteratee - An async function to apply to each item in* `coll`.* The iteratee should complete with a value to use as the sort criteria as* its `result`.* Invoked with (item, callback).* @param {Function} callback - A callback which is called after all the* `iteratee` functions have finished, or an error occurs. Results is the items* from the original `coll` sorted by the values returned by the `iteratee`* calls. Invoked with (err, results).* @example** async.sortBy(['file1','file2','file3'], function(file, callback) {*     fs.stat(file, function(err, stats) {*         callback(err, stats.mtime);*     });* }, function(err, results) {*     // results is now the original array of files sorted by*     // modified date* });** // By modifying the callback parameter the* // sorting order can be influenced:** // ascending order* async.sortBy([1,9,3,5], function(x, callback) {*     callback(null, x);* }, function(err,result) {*     // result callback* });** // descending order* async.sortBy([1,9,3,5], function(x, callback) {*     callback(null, x*-1);    //<- x*-1 instead of x, turns the order around* }, function(err,result) {*     // result callback* });*/
function sortBy (coll, iteratee, callback) {var _iteratee = wrapAsync(iteratee);map(coll, function (x, callback) {_iteratee(x, function (err, criteria) {if (err) return callback(err);callback(null, {value: x, criteria: criteria});});}, function (err, results) {if (err) return callback(err);callback(null, arrayMap(results.sort(comparator), baseProperty('value')));});function comparator(left, right) {var a = left.criteria, b = right.criteria;return a < b ? -1 : a > b ? 1 : 0;}
}/*** Sets a time limit on an asynchronous function. If the function does not call* its callback within the specified milliseconds, it will be called with a* timeout error. The code property for the error object will be `'ETIMEDOUT'`.** @name timeout* @static* @memberOf module:Utils* @method* @category Util* @param {AsyncFunction} asyncFn - The async function to limit in time.* @param {number} milliseconds - The specified time limit.* @param {*} [info] - Any variable you want attached (`string`, `object`, etc)* to timeout Error for more information..* @returns {AsyncFunction} Returns a wrapped function that can be used with any* of the control flow functions.* Invoke this function with the same parameters as you would `asyncFunc`.* @example** function myFunction(foo, callback) {*     doAsyncTask(foo, function(err, data) {*         // handle errors*         if (err) return callback(err);**         // do some stuff ...**         // return processed data*         return callback(null, data);*     });* }** var wrapped = async.timeout(myFunction, 1000);** // call `wrapped` as you would `myFunction`* wrapped({ bar: 'bar' }, function(err, data) {*     // if `myFunction` takes < 1000 ms to execute, `err`*     // and `data` will have their expected values**     // else `err` will be an Error with the code 'ETIMEDOUT'* });*/
function timeout(asyncFn, milliseconds, info) {var fn = wrapAsync(asyncFn);return initialParams(function (args, callback) {var timedOut = false;var timer;function timeoutCallback() {var name = asyncFn.name || 'anonymous';var error  = new Error('Callback function "' + name + '" timed out.');error.code = 'ETIMEDOUT';if (info) {error.info = info;}timedOut = true;callback(error);}args.push(function () {if (!timedOut) {callback.apply(null, arguments);clearTimeout(timer);}});// setup timer and call original functiontimer = setTimeout(timeoutCallback, milliseconds);fn.apply(null, args);});
}/* Built-in method references for those with the same name as other `lodash` methods. */
var nativeCeil = Math.ceil;
var nativeMax = Math.max;/*** The base implementation of `_.range` and `_.rangeRight` which doesn't* coerce arguments.** @private* @param {number} start The start of the range.* @param {number} end The end of the range.* @param {number} step The value to increment or decrement by.* @param {boolean} [fromRight] Specify iterating from right to left.* @returns {Array} Returns the range of numbers.*/
function baseRange(start, end, step, fromRight) {var index = -1,length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),result = Array(length);while (length--) {result[fromRight ? length : ++index] = start;start += step;}return result;
}/*** The same as [times]{@link module:ControlFlow.times} but runs a maximum of `limit` async operations at a* time.** @name timesLimit* @static* @memberOf module:ControlFlow* @method* @see [async.times]{@link module:ControlFlow.times}* @category Control Flow* @param {number} count - The number of times to run the function.* @param {number} limit - The maximum number of async operations at a time.* @param {AsyncFunction} iteratee - The async function to call `n` times.* Invoked with the iteration index and a callback: (n, next).* @param {Function} callback - see [async.map]{@link module:Collections.map}.*/
function timeLimit(count, limit, iteratee, callback) {var _iteratee = wrapAsync(iteratee);mapLimit(baseRange(0, count, 1), limit, _iteratee, callback);
}/*** Calls the `iteratee` function `n` times, and accumulates results in the same* manner you would use with [map]{@link module:Collections.map}.** @name times* @static* @memberOf module:ControlFlow* @method* @see [async.map]{@link module:Collections.map}* @category Control Flow* @param {number} n - The number of times to run the function.* @param {AsyncFunction} iteratee - The async function to call `n` times.* Invoked with the iteration index and a callback: (n, next).* @param {Function} callback - see {@link module:Collections.map}.* @example** // Pretend this is some complicated async factory* var createUser = function(id, callback) {*     callback(null, {*         id: 'user' + id*     });* };** // generate 5 users* async.times(5, function(n, next) {*     createUser(n, function(err, user) {*         next(err, user);*     });* }, function(err, users) {*     // we should now have 5 users* });*/
var times = doLimit(timeLimit, Infinity);/*** The same as [times]{@link module:ControlFlow.times} but runs only a single async operation at a time.** @name timesSeries* @static* @memberOf module:ControlFlow* @method* @see [async.times]{@link module:ControlFlow.times}* @category Control Flow* @param {number} n - The number of times to run the function.* @param {AsyncFunction} iteratee - The async function to call `n` times.* Invoked with the iteration index and a callback: (n, next).* @param {Function} callback - see {@link module:Collections.map}.*/
var timesSeries = doLimit(timeLimit, 1);/*** A relative of `reduce`.  Takes an Object or Array, and iterates over each* element in series, each step potentially mutating an `accumulator` value.* The type of the accumulator defaults to the type of collection passed in.** @name transform* @static* @memberOf module:Collections* @method* @category Collection* @param {Array|Iterable|Object} coll - A collection to iterate over.* @param {*} [accumulator] - The initial state of the transform.  If omitted,* it will default to an empty Object or Array, depending on the type of `coll`* @param {AsyncFunction} iteratee - A function applied to each item in the* collection that potentially modifies the accumulator.* Invoked with (accumulator, item, key, callback).* @param {Function} [callback] - A callback which is called after all the* `iteratee` functions have finished. Result is the transformed accumulator.* Invoked with (err, result).* @example** async.transform([1,2,3], function(acc, item, index, callback) {*     // pointless async:*     process.nextTick(function() {*         acc.push(item * 2)*         callback(null)*     });* }, function(err, result) {*     // result is now equal to [2, 4, 6]* });** @example** async.transform({a: 1, b: 2, c: 3}, function (obj, val, key, callback) {*     setImmediate(function () {*         obj[key] = val * 2;*         callback();*     })* }, function (err, result) {*     // result is equal to {a: 2, b: 4, c: 6}* })*/
function transform (coll, accumulator, iteratee, callback) {if (arguments.length <= 3) {callback = iteratee;iteratee = accumulator;accumulator = isArray(coll) ? [] : {};}callback = once(callback || noop);var _iteratee = wrapAsync(iteratee);eachOf(coll, function(v, k, cb) {_iteratee(accumulator, v, k, cb);}, function(err) {callback(err, accumulator);});
}/*** It runs each task in series but stops whenever any of the functions were* successful. If one of the tasks were successful, the `callback` will be* passed the result of the successful task. If all tasks fail, the callback* will be passed the error and result (if any) of the final attempt.** @name tryEach* @static* @memberOf module:ControlFlow* @method* @category Control Flow* @param {Array|Iterable|Object} tasks - A collection containing functions to* run, each function is passed a `callback(err, result)` it must call on* completion with an error `err` (which can be `null`) and an optional `result`* value.* @param {Function} [callback] - An optional callback which is called when one* of the tasks has succeeded, or all have failed. It receives the `err` and* `result` arguments of the last attempt at completing the `task`. Invoked with* (err, results).* @example* async.try([*     function getDataFromFirstWebsite(callback) {*         // Try getting the data from the first website*         callback(err, data);*     },*     function getDataFromSecondWebsite(callback) {*         // First website failed,*         // Try getting the data from the backup website*         callback(err, data);*     }* ],* // optional callback* function(err, results) {*     Now do something with the data.* });**/
function tryEach(tasks, callback) {var error = null;var result;callback = callback || noop;eachSeries(tasks, function(task, callback) {wrapAsync(task)(function (err, res/*, ...args*/) {if (arguments.length > 2) {result = slice(arguments, 1);} else {result = res;}error = err;callback(!err);});}, function () {callback(error, result);});
}/*** Undoes a [memoize]{@link module:Utils.memoize}d function, reverting it to the original,* unmemoized form. Handy for testing.** @name unmemoize* @static* @memberOf module:Utils* @method* @see [async.memoize]{@link module:Utils.memoize}* @category Util* @param {AsyncFunction} fn - the memoized function* @returns {AsyncFunction} a function that calls the original unmemoized function*/
function unmemoize(fn) {return function () {return (fn.unmemoized || fn).apply(null, arguments);};
}/*** Repeatedly call `iteratee`, while `test` returns `true`. Calls `callback` when* stopped, or an error occurs.** @name whilst* @static* @memberOf module:ControlFlow* @method* @category Control Flow* @param {Function} test - synchronous truth test to perform before each* execution of `iteratee`. Invoked with ().* @param {AsyncFunction} iteratee - An async function which is called each time* `test` passes. Invoked with (callback).* @param {Function} [callback] - A callback which is called after the test* function has failed and repeated execution of `iteratee` has stopped. `callback`* will be passed an error and any arguments passed to the final `iteratee`'s* callback. Invoked with (err, [results]);* @returns undefined* @example** var count = 0;* async.whilst(*     function() { return count < 5; },*     function(callback) {*         count++;*         setTimeout(function() {*             callback(null, count);*         }, 1000);*     },*     function (err, n) {*         // 5 seconds have passed, n = 5*     }* );*/
function whilst(test, iteratee, callback) {callback = onlyOnce(callback || noop);var _iteratee = wrapAsync(iteratee);if (!test()) return callback(null);var next = function(err/*, ...args*/) {if (err) return callback(err);if (test()) return _iteratee(next);var args = slice(arguments, 1);callback.apply(null, [null].concat(args));};_iteratee(next);
}/*** Repeatedly call `iteratee` until `test` returns `true`. Calls `callback` when* stopped, or an error occurs. `callback` will be passed an error and any* arguments passed to the final `iteratee`'s callback.** The inverse of [whilst]{@link module:ControlFlow.whilst}.** @name until* @static* @memberOf module:ControlFlow* @method* @see [async.whilst]{@link module:ControlFlow.whilst}* @category Control Flow* @param {Function} test - synchronous truth test to perform before each* execution of `iteratee`. Invoked with ().* @param {AsyncFunction} iteratee - An async function which is called each time* `test` fails. Invoked with (callback).* @param {Function} [callback] - A callback which is called after the test* function has passed and repeated execution of `iteratee` has stopped. `callback`* will be passed an error and any arguments passed to the final `iteratee`'s* callback. Invoked with (err, [results]);*/
function until(test, iteratee, callback) {whilst(function() {return !test.apply(this, arguments);}, iteratee, callback);
}/*** Runs the `tasks` array of functions in series, each passing their results to* the next in the array. However, if any of the `tasks` pass an error to their* own callback, the next function is not executed, and the main `callback` is* immediately called with the error.** 连续执行数组中的函数,每次通过数组下一个函数的结果。* 然而,数组任务中的任意一个函数结果传递失败,那么该函数的下一个函数将不会执行,* 并且主回调函数立马把错误作为参数执行。*** @name waterfall* @static* @memberOf module:ControlFlow* @method* @category Control Flow* @param {Array} tasks - An array of [async functions]{@link AsyncFunction}* to run.* Each function should complete with any number of `result` values.* The `result` values will be passed as arguments, in order, to the next task.* @param {Function} [callback] - An optional callback to run once all the* functions have completed. This will be passed the results of the last task's* callback. Invoked with (err, [results]).* @returns undefined* @example** async.waterfall([*     function(callback) {*         callback(null, 'one', 'two');*     },*     function(arg1, arg2, callback) {*         // arg1 now equals 'one' and arg2 now equals 'two'*         callback(null, 'three');*     },*     function(arg1, callback) {*         // arg1 now equals 'three'*         callback(null, 'done');*     }* ], function (err, result) {*     // result now equals 'done'* });** // Or, with named functions:* async.waterfall([*     myFirstFunction,*     mySecondFunction,*     myLastFunction,* ], function (err, result) {*     // result now equals 'done'* });* function myFirstFunction(callback) {*     callback(null, 'one', 'two');* }* function mySecondFunction(arg1, arg2, callback) {*     // arg1 now equals 'one' and arg2 now equals 'two'*     callback(null, 'three');* }* function myLastFunction(arg1, callback) {*     // arg1 now equals 'three'*     callback(null, 'done');* }*/
var waterfall = function(tasks, callback) {    // tasks: 异步函数数组容器, callback: 回调callback = once(callback || noop);    // 回调函数if (!isArray(tasks)) return callback(new Error('First argument to waterfall must be an array of functions'));    // 第一个参数必须是数组(函数数组)!if (!tasks.length) return callback();    // 空数组的话直接调用回调函数(无参数)var taskIndex = 0;    // 任务索引function nextTask(args) {    // 参数数组var task = wrapAsync(tasks[taskIndex++]);    // 数组中的任务args.push(onlyOnce(next));    // 把next方法添加到args数组中去task.apply(null, args);    // 调用数组中task函数(参数是数组)
    };function next(err/*, ...args*/) {    // 其实就是函数参数中的回调函数callbackif (err || taskIndex === tasks.length) {    // 只要有错误或者函数数组任务都完成了return callback.apply(null, arguments);    // 就执行回调
        };nextTask(slice(arguments, 1));    // 数组中的函数没循环完且没出错,那就继续调用
    };nextTask([]);    // 调用
};/*** An "async function" in the context of Async is an asynchronous function with* a variable number of parameters, with the final parameter being a callback.* (`function (arg1, arg2, ..., callback) {}`)* The final callback is of the form `callback(err, results...)`, which must be* called once the function is completed.  The callback should be called with a* Error as its first argument to signal that an error occurred.* Otherwise, if no error occurred, it should be called with `null` as the first* argument, and any additional `result` arguments that may apply, to signal* successful completion.* The callback must be called exactly once, ideally on a later tick of the* JavaScript event loop.** This type of function is also referred to as a "Node-style async function",* or a "continuation passing-style function" (CPS). Most of the methods of this* library are themselves CPS/Node-style async functions, or functions that* return CPS/Node-style async functions.** Wherever we accept a Node-style async function, we also directly accept an* [ES2017 `async` function]{@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function}.* In this case, the `async` function will not be passed a final callback* argument, and any thrown error will be used as the `err` argument of the* implicit callback, and the return value will be used as the `result` value.* (i.e. a `rejected` of the returned Promise becomes the `err` callback* argument, and a `resolved` value becomes the `result`.)** Note, due to JavaScript limitations, we can only detect native `async`* functions and not transpilied implementations.* Your environment must have `async`/`await` support for this to work.* (e.g. Node > v7.6, or a recent version of a modern browser).* If you are using `async` functions through a transpiler (e.g. Babel), you* must still wrap the function with [asyncify]{@link module:Utils.asyncify},* because the `async function` will be compiled to an ordinary function that* returns a promise.** @typedef {Function} AsyncFunction* @static*//*** Async is a utility module which provides straight-forward, powerful functions* for working with asynchronous JavaScript. Although originally designed for* use with [Node.js](http://nodejs.org) and installable via* `npm install --save async`, it can also be used directly in the browser.* @module async* @see AsyncFunction*//*** A collection of `async` functions for manipulating collections, such as* arrays and objects.* @module Collections*//*** A collection of `async` functions for controlling the flow through a script.* @module ControlFlow*//*** A collection of `async` utility functions.* @module Utils*/var index = {applyEach: applyEach,applyEachSeries: applyEachSeries,apply: apply,asyncify: asyncify,auto: auto,autoInject: autoInject,cargo: cargo,compose: compose,concat: concat,concatSeries: concatSeries,constant: constant,detect: detect,detectLimit: detectLimit,detectSeries: detectSeries,dir: dir,doDuring: doDuring,doUntil: doUntil,doWhilst: doWhilst,during: during,each: eachLimit,eachLimit: eachLimit$1,eachOf: eachOf,eachOfLimit: eachOfLimit,eachOfSeries: eachOfSeries,eachSeries: eachSeries,ensureAsync: ensureAsync,every: every,everyLimit: everyLimit,everySeries: everySeries,filter: filter,filterLimit: filterLimit,filterSeries: filterSeries,forever: forever,groupBy: groupBy,groupByLimit: groupByLimit,groupBySeries: groupBySeries,log: log,map: map,mapLimit: mapLimit,mapSeries: mapSeries,mapValues: mapValues,mapValuesLimit: mapValuesLimit,mapValuesSeries: mapValuesSeries,memoize: memoize,nextTick: nextTick,parallel: parallelLimit,parallelLimit: parallelLimit$1,priorityQueue: priorityQueue,queue: queue$1,race: race,reduce: reduce,reduceRight: reduceRight,reflect: reflect,reflectAll: reflectAll,reject: reject,rejectLimit: rejectLimit,rejectSeries: rejectSeries,retry: retry,retryable: retryable,seq: seq,series: series,setImmediate: setImmediate$1,some: some,someLimit: someLimit,someSeries: someSeries,sortBy: sortBy,timeout: timeout,times: times,timesLimit: timeLimit,timesSeries: timesSeries,transform: transform,tryEach: tryEach,unmemoize: unmemoize,until: until,waterfall: waterfall,whilst: whilst,// aliases
    all: every,any: some,forEach: eachLimit,forEachSeries: eachSeries,forEachLimit: eachLimit$1,forEachOf: eachOf,forEachOfSeries: eachOfSeries,forEachOfLimit: eachOfLimit,inject: reduce,foldl: reduce,foldr: reduceRight,select: filter,selectLimit: filterLimit,selectSeries: filterSeries,wrapSync: asyncify
};exports['default'] = index;
exports.applyEach = applyEach;
exports.applyEachSeries = applyEachSeries;
exports.apply = apply;
exports.asyncify = asyncify;
exports.auto = auto;
exports.autoInject = autoInject;
exports.cargo = cargo;
exports.compose = compose;
exports.concat = concat;
exports.concatSeries = concatSeries;
exports.constant = constant;
exports.detect = detect;
exports.detectLimit = detectLimit;
exports.detectSeries = detectSeries;
exports.dir = dir;
exports.doDuring = doDuring;
exports.doUntil = doUntil;
exports.doWhilst = doWhilst;
exports.during = during;
exports.each = eachLimit;
exports.eachLimit = eachLimit$1;
exports.eachOf = eachOf;
exports.eachOfLimit = eachOfLimit;
exports.eachOfSeries = eachOfSeries;
exports.eachSeries = eachSeries;
exports.ensureAsync = ensureAsync;
exports.every = every;
exports.everyLimit = everyLimit;
exports.everySeries = everySeries;
exports.filter = filter;
exports.filterLimit = filterLimit;
exports.filterSeries = filterSeries;
exports.forever = forever;
exports.groupBy = groupBy;
exports.groupByLimit = groupByLimit;
exports.groupBySeries = groupBySeries;
exports.log = log;
exports.map = map;
exports.mapLimit = mapLimit;
exports.mapSeries = mapSeries;
exports.mapValues = mapValues;
exports.mapValuesLimit = mapValuesLimit;
exports.mapValuesSeries = mapValuesSeries;
exports.memoize = memoize;
exports.nextTick = nextTick;
exports.parallel = parallelLimit;
exports.parallelLimit = parallelLimit$1;
exports.priorityQueue = priorityQueue;
exports.queue = queue$1;
exports.race = race;
exports.reduce = reduce;
exports.reduceRight = reduceRight;
exports.reflect = reflect;
exports.reflectAll = reflectAll;
exports.reject = reject;
exports.rejectLimit = rejectLimit;
exports.rejectSeries = rejectSeries;
exports.retry = retry;
exports.retryable = retryable;
exports.seq = seq;
exports.series = series;
exports.setImmediate = setImmediate$1;
exports.some = some;
exports.someLimit = someLimit;
exports.someSeries = someSeries;
exports.sortBy = sortBy;
exports.timeout = timeout;
exports.times = times;
exports.timesLimit = timeLimit;
exports.timesSeries = timesSeries;
exports.transform = transform;
exports.tryEach = tryEach;
exports.unmemoize = unmemoize;
exports.until = until;
exports.waterfall = waterfall;
exports.whilst = whilst;
exports.all = every;
exports.allLimit = everyLimit;
exports.allSeries = everySeries;
exports.any = some;
exports.anyLimit = someLimit;
exports.anySeries = someSeries;
exports.find = detect;
exports.findLimit = detectLimit;
exports.findSeries = detectSeries;
exports.forEach = eachLimit;
exports.forEachSeries = eachSeries;
exports.forEachLimit = eachLimit$1;
exports.forEachOf = eachOf;
exports.forEachOfSeries = eachOfSeries;
exports.forEachOfLimit = eachOfLimit;
exports.inject = reduce;
exports.foldl = reduce;
exports.foldr = reduceRight;
exports.select = filter;
exports.selectLimit = filterLimit;
exports.selectSeries = filterSeries;
exports.wrapSync = asyncify;Object.defineProperty(exports, '__esModule', { value: true });})));

 

转载于:https://www.cnblogs.com/sorrowx/p/6918353.html

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 如何正确克隆JavaScript对象?

    我有一个对象x 。 我想将其复制为对象y &#xff0c;以使对y更改不会修改x 。 我意识到&#xff0c;复制从内置JavaScript对象派生的对象将导致额外的不需要的属性。 这不是问题&#xff0c;因为我正在复制自己的文字构造对象之一。 如何正确克隆JavaScript对象&#xff1f; #…...

    2024/4/21 16:27:37
  2. 深入理解Javascript中的隐式调用

    本篇文章给大家详细介绍了javascript中的隐式调用相关知识点&#xff0c;写的十分的全面细致&#xff0c;具有一定的参考价值&#xff0c;对此有需要的朋友可以参考学习下。如有不足之处&#xff0c;欢迎批评指正。 不知道用隐式调用来形容是否确切,其行为总是隐藏在背后&#…...

    2024/4/21 16:27:37
  3. 8月

    1.报错 slice 清除cookie2.table 的pagechange事件&#xff0c;就是当点击页码的时候执行这个事件3.角色列表初始化的时候不需要执行查询角色列表&#xff0c;在ngOnchanges里面执行就可以了&#xff0c;当有输入属性的时候先执行onchanges的钩子&#xff0c;然后在执行ogonin…...

    2024/4/23 20:41:22
  4. 双眼皮双两层怎么改善

    ...

    2024/4/21 16:27:36
  5. 双眼皮术前术后对比照

    ...

    2024/4/21 16:27:33
  6. 双眼皮术前签字

    ...

    2024/4/21 16:27:32
  7. 在jsfiddle作在线angular测试,蛮有意思的

    jsfiddle.net 快速学知识&#xff0c;比本地自己弄快&#xff0c;当然&#xff0c;不能用于太复杂的应用啦。。 比如&#xff1a;学到directive的scope继承隔离作用域时&#xff0c;就可以这样弄。 scope 可选参数&#xff0c;&#xff08;布尔值或者对象&#xff09;默认值为f…...

    2024/4/20 14:24:12
  8. 双眼皮术前没有休息好

    ...

    2024/4/20 14:24:11
  9. 双眼皮术前哭

    ...

    2024/4/20 14:24:10
  10. Vue到底是怎样个框架?

    一、Vue介绍 过去的十年&#xff0c;我们的网页变得更加动态化和强大&#xff0c;是因为有JAVAScript&#xff0c;我们已经把很多传统服务端代码放到浏览器中这样就产生了成千上万行的JavaScript代码&#xff0c;他们链接了各种各样的HTML和CSS文件&#xff0c;但缺乏正规的组织…...

    2024/4/20 14:24:09
  11. 双眼皮术前可以吃东西

    ...

    2024/4/21 16:27:32
  12. 双眼皮术后一年恢复图

    ...

    2024/4/21 16:27:31
  13. 双眼皮术后眼睛向上看

    ...

    2024/4/21 16:27:29
  14. angular表单经验分享

    原文 https://www.jianshu.com/p/af359bd04f32 大纲 1、表单的名字不可以和传入的值的名字相同  2、在模板驱动表单的时候要使用angular表单的验证功能&#xff0c;需要将ngModel绑定到模板变量&#xff0c;通过模板变量来判断调用验证器  3、模板驱动表单如何绑定radio单选…...

    2024/4/21 16:27:28
  15. 双眼皮术后眼睛弄破了

    ...

    2024/4/21 16:27:27
  16. 双眼皮术后能外出

    ...

    2024/4/21 16:27:26
  17. 双眼皮术后两个月疤痒

    ...

    2024/4/21 16:27:25
  18. 双眼皮术后可以吃芒果

    ...

    2024/4/28 13:11:29
  19. 双眼皮术后禁食牛羊肉

    ...

    2024/4/21 16:27:24
  20. VARIANT、COleVariant 和_variant_

     在OLE、ActiveX和COM中,VARIANT数据类型提供了一种非常有效的机制、由于它既包含了数据本身,也包含了数据的类型,因而它可以实现各种不同的自动化数据的传输。下面让我们来看看OAIDL.H文件中VARIANT定义的一个简化版: struct tagVARIANT {  VARTYPE vt;  union {  …...

    2024/4/21 16:27:22

最新文章

  1. 3.电源模块趋旺盛,铁路最需可靠性

    电源模块趋旺盛&#xff0c;铁路最需可靠性 电源设计需要很高的专业技能。越来越多的电子设备制造商开始采用电源模块来加快设计周期。通信、铁路、电力和军工领域&#xff0c;对电源模块需求越来越旺盛。 通信网络基建设备市场潜力巨大。应市场要求&#xff0c;现代的通信系…...

    2024/5/1 1:50:17
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. Linux nsenter命令全面解析

    Linux nsenter命令是一个强大的工具&#x1f6e0;️&#xff0c;用于进入到已存在的命名空间&#xff08;Namespace&#xff09;中执行命令。由于Linux的命名空间技术是构建容器技术的基础&#xff0c;nsenter因此成为了容器管理和调试中不可或缺的工具&#x1f433;。本文将从…...

    2024/4/30 2:51:34
  4. WPS二次开发专题:WPS SDK实现文档打印功能

    作者持续关注WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;QQ:250325397&#xff09; 在办公场景或者家教场景中经常碰到需要对文档进行打印…...

    2024/4/30 8:00:33
  5. Dapr(一) 基于云原生了解Dapr

    (这期先了解Dapr&#xff0c;之后在推出如何搭建Dapr&#xff0c;以及如何使用。Dapr(二) 分布式应用运行时搭建及服务调用--Dapr(二) 分布式应用运行时搭建及服务调用-CSDN博客) 目录 引言&#xff1a; Service Mesh定义 Service Mesh解决的痛点 Istio介绍 Service Mes…...

    2024/4/30 16:34:16
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/29 23:16:47
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/30 18:14:14
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/30 18:21:48
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/30 9:43:22
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57