|
@@ -60,6 +60,8 @@
|
|
|
};
|
|
|
}
|
|
|
|
|
|
+ /* istanbul ignore file */
|
|
|
+
|
|
|
var hasSetImmediate = typeof setImmediate === 'function' && setImmediate;
|
|
|
var hasNextTick = typeof process === 'object' && typeof process.nextTick === 'function';
|
|
|
|
|
@@ -215,10 +217,6 @@
|
|
|
})
|
|
|
}
|
|
|
|
|
|
- Object.defineProperty(awaitable, 'name', {
|
|
|
- value: `awaitable(${asyncFn.name})`
|
|
|
- });
|
|
|
-
|
|
|
return awaitable
|
|
|
}
|
|
|
|
|
@@ -617,13 +615,14 @@
|
|
|
* 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.
|
|
|
+ * @returns {AsyncFunction} - Returns a function that takes no args other than
|
|
|
+ * an optional callback, that is the result of applying the `args` to each
|
|
|
+ * of the functions.
|
|
|
* @example
|
|
|
*
|
|
|
- * async.applyEach([enableSearch, updateSchema], 'bucket', (err, results) => {
|
|
|
+ * const appliedFn = async.applyEach([enableSearch, updateSchema], 'bucket')
|
|
|
+ *
|
|
|
+ * appliedFn((err, results) => {
|
|
|
* // results[0] is the results for `enableSearch`
|
|
|
* // results[1] is the results for `updateSchema`
|
|
|
* });
|
|
@@ -631,7 +630,7 @@
|
|
|
* // partial application example:
|
|
|
* async.each(
|
|
|
* buckets,
|
|
|
- * async.applyEach([enableSearch, updateSchema]),
|
|
|
+ * async (bucket) => async.applyEach([enableSearch, updateSchema], bucket)(),
|
|
|
* callback
|
|
|
* );
|
|
|
*/
|
|
@@ -699,9 +698,9 @@
|
|
|
* 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.
|
|
|
+ * @returns {AsyncFunction} - A function, that when called, is the result of
|
|
|
+ * appling the `args` to the list of functions. It takes no args, other than
|
|
|
+ * a callback.
|
|
|
*/
|
|
|
var applyEachSeries = applyEach(mapSeries$1);
|
|
|
|
|
@@ -973,8 +972,8 @@
|
|
|
return callback[PROMISE_SYMBOL]
|
|
|
}
|
|
|
|
|
|
- var FN_ARGS = /^(?:async\s+)?(?:function)?\s*[^(]*\(\s*([^)]+)\s*\)(?:\s*{)/m;
|
|
|
- var ARROW_FN_ARGS = /^(?:async\s+)?(?:function\s+)?\(?\s*([^)^=]+)\s*\)?(?:\s*=>)/m;
|
|
|
+ var FN_ARGS = /^(?:async\s+)?(?:function)?\s*\w*\s*\(\s*([^)]+)\s*\)(?:\s*{)/;
|
|
|
+ var ARROW_FN_ARGS = /^(?:async\s+)?\(?\s*([^)=]+)\s*\)?(?:\s*=>)/;
|
|
|
var FN_ARG_SPLIT = /,/;
|
|
|
var FN_ARG = /(=.+)?(\s*)$/;
|
|
|
var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
|
|
@@ -1251,27 +1250,26 @@
|
|
|
}
|
|
|
|
|
|
var processingScheduled = false;
|
|
|
- function _insert(data, insertAtFront, callback) {
|
|
|
+ function _insert(data, insertAtFront, rejectOnError, callback) {
|
|
|
if (callback != null && typeof callback !== 'function') {
|
|
|
throw new Error('task callback must be a function');
|
|
|
}
|
|
|
q.started = true;
|
|
|
- /*if (Array.isArray(data)) {
|
|
|
-
|
|
|
- return data.map(datum => _insert(datum, insertAtFront, callback));
|
|
|
- }*/
|
|
|
|
|
|
- var res;
|
|
|
+ var res, rej;
|
|
|
+ function promiseCallback (err, ...args) {
|
|
|
+ // we don't care about the error, let the global error handler
|
|
|
+ // deal with it
|
|
|
+ if (err) return rejectOnError ? rej(err) : res()
|
|
|
+ if (args.length <= 1) return res(args[0])
|
|
|
+ res(args);
|
|
|
+ }
|
|
|
|
|
|
var item = {
|
|
|
data,
|
|
|
- callback: callback || function (err, ...args) {
|
|
|
- // we don't care about the error, let the global error handler
|
|
|
- // deal with it
|
|
|
- if (err) return
|
|
|
- if (args.length <= 1) return res(args[0])
|
|
|
- res(args);
|
|
|
- }
|
|
|
+ callback: rejectOnError ?
|
|
|
+ promiseCallback :
|
|
|
+ (callback || promiseCallback)
|
|
|
};
|
|
|
|
|
|
if (insertAtFront) {
|
|
@@ -1288,9 +1286,10 @@
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- if (!callback) {
|
|
|
- return new Promise((resolve) => {
|
|
|
+ if (rejectOnError || !callback) {
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
res = resolve;
|
|
|
+ rej = reject;
|
|
|
})
|
|
|
}
|
|
|
}
|
|
@@ -1327,6 +1326,15 @@
|
|
|
};
|
|
|
}
|
|
|
|
|
|
+ function _maybeDrain(data) {
|
|
|
+ if (data.length === 0 && q.idle()) {
|
|
|
+ // call drain immediately if there are no tasks
|
|
|
+ setImmediate$1(() => trigger('drain'));
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
const eventMethod = (name) => (handler) => {
|
|
|
if (!handler) {
|
|
|
return new Promise((resolve, reject) => {
|
|
@@ -1354,13 +1362,17 @@
|
|
|
paused: false,
|
|
|
push (data, callback) {
|
|
|
if (Array.isArray(data)) {
|
|
|
- if (data.length === 0 && q.idle()) {
|
|
|
- // call drain immediately if there are no tasks
|
|
|
- return setImmediate$1(() => trigger('drain'));
|
|
|
- }
|
|
|
- return data.map(datum => _insert(datum, false, callback))
|
|
|
+ if (_maybeDrain(data)) return
|
|
|
+ return data.map(datum => _insert(datum, false, false, callback))
|
|
|
+ }
|
|
|
+ return _insert(data, false, false, callback);
|
|
|
+ },
|
|
|
+ pushAsync (data, callback) {
|
|
|
+ if (Array.isArray(data)) {
|
|
|
+ if (_maybeDrain(data)) return
|
|
|
+ return data.map(datum => _insert(datum, false, true, callback))
|
|
|
}
|
|
|
- return _insert(data, false, callback);
|
|
|
+ return _insert(data, false, true, callback);
|
|
|
},
|
|
|
kill () {
|
|
|
off();
|
|
@@ -1368,13 +1380,17 @@
|
|
|
},
|
|
|
unshift (data, callback) {
|
|
|
if (Array.isArray(data)) {
|
|
|
- if (data.length === 0 && q.idle()) {
|
|
|
- // call drain immediately if there are no tasks
|
|
|
- return setImmediate$1(() => trigger('drain'));
|
|
|
- }
|
|
|
- return data.map(datum => _insert(datum, true, callback))
|
|
|
+ if (_maybeDrain(data)) return
|
|
|
+ return data.map(datum => _insert(datum, true, false, callback))
|
|
|
+ }
|
|
|
+ return _insert(data, true, false, callback);
|
|
|
+ },
|
|
|
+ unshiftAsync (data, callback) {
|
|
|
+ if (Array.isArray(data)) {
|
|
|
+ if (_maybeDrain(data)) return
|
|
|
+ return data.map(datum => _insert(datum, true, true, callback))
|
|
|
}
|
|
|
- return _insert(data, true, callback);
|
|
|
+ return _insert(data, true, true, callback);
|
|
|
},
|
|
|
remove (testFn) {
|
|
|
q._tasks.remove(testFn);
|
|
@@ -1536,7 +1552,7 @@
|
|
|
* @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 cargoQueue object to manage the tasks. Callbacks can
|
|
|
+ * @returns {module:ControlFlow.QueueObject} A cargoQueue object to manage the tasks. Callbacks can
|
|
|
* attached as certain properties to listen for specific events during the
|
|
|
* lifecycle of the cargoQueue and inner queue.
|
|
|
* @example
|
|
@@ -2925,7 +2941,7 @@
|
|
|
|
|
|
var nextTick = wrap(_defer$1);
|
|
|
|
|
|
- var _parallel = awaitify((eachfn, tasks, callback) => {
|
|
|
+ var parallel = awaitify((eachfn, tasks, callback) => {
|
|
|
var results = isArrayLike(tasks) ? [] : {};
|
|
|
|
|
|
eachfn(tasks, (task, key, taskCb) => {
|
|
@@ -3009,8 +3025,8 @@
|
|
|
* // results is now equals to: {one: 1, two: 2}
|
|
|
* });
|
|
|
*/
|
|
|
- function parallel(tasks, callback) {
|
|
|
- return _parallel(eachOf$1, tasks, callback);
|
|
|
+ function parallel$1(tasks, callback) {
|
|
|
+ return parallel(eachOf$1, tasks, callback);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -3034,7 +3050,7 @@
|
|
|
* @returns {Promise} a promise, if a callback is not passed
|
|
|
*/
|
|
|
function parallelLimit(tasks, limit, callback) {
|
|
|
- return _parallel(eachOfLimit(limit), tasks, callback);
|
|
|
+ return parallel(eachOfLimit(limit), tasks, callback);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -3057,12 +3073,16 @@
|
|
|
* @property {number} payload - an integer that specifies how many items are
|
|
|
* passed to the worker function at a time. only applies if this is a
|
|
|
* [cargo]{@link module:ControlFlow.cargo} object
|
|
|
- * @property {Function} push - add a new task to the `queue`. Calls `callback`
|
|
|
+ * @property {AsyncFunction} 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`.
|
|
|
+ * @property {AsyncFunction} unshift - add a new task to the front of the `queue`.
|
|
|
* Invoke with `queue.unshift(task, [callback])`.
|
|
|
+ * @property {AsyncFunction} pushAsync - the same as `q.push`, except this returns
|
|
|
+ * a promise that rejects if an error occurs.
|
|
|
+ * @property {AsyncFunction} unshirtAsync - the same as `q.unshift`, except this returns
|
|
|
+ * a promise that rejects if an error occurs.
|
|
|
* @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
|
|
@@ -3100,7 +3120,7 @@
|
|
|
* should be pushed to the queue after calling this function. Invoke with `queue.kill()`.
|
|
|
*
|
|
|
* @example
|
|
|
- * const q = aync.queue(worker, 2)
|
|
|
+ * const q = async.queue(worker, 2)
|
|
|
* q.push(item1)
|
|
|
* q.push(item2)
|
|
|
* q.push(item3)
|
|
@@ -3934,7 +3954,7 @@
|
|
|
* });
|
|
|
*/
|
|
|
function series(tasks, callback) {
|
|
|
- return _parallel(eachOfSeries$1, tasks, callback);
|
|
|
+ return parallel(eachOfSeries$1, tasks, callback);
|
|
|
}
|
|
|
|
|
|
/**
|
|
@@ -4408,7 +4428,7 @@
|
|
|
*
|
|
|
* var count = 0;
|
|
|
* async.whilst(
|
|
|
- * function test(cb) { cb(null, count < 5;) },
|
|
|
+ * function test(cb) { cb(null, count < 5); },
|
|
|
* function iter(callback) {
|
|
|
* count++;
|
|
|
* setTimeout(function() {
|
|
@@ -4469,14 +4489,16 @@
|
|
|
*
|
|
|
* @example
|
|
|
* const results = []
|
|
|
- * async.until(function iter(next) {
|
|
|
+ * let finished = false
|
|
|
+ * async.until(function test(page, cb) {
|
|
|
+ * cb(null, finished)
|
|
|
+ * }, function iter(next) {
|
|
|
* fetchPage(url, (err, body) => {
|
|
|
* if (err) return next(err)
|
|
|
* results = results.concat(body.objects)
|
|
|
- * next(err, body)
|
|
|
+ * finished = !!body.next
|
|
|
+ * next(err)
|
|
|
* })
|
|
|
- * }, function test(page, cb) {
|
|
|
- * cb(null, page.next == null)
|
|
|
* }, function done (err) {
|
|
|
* // all pages have been fetched
|
|
|
* })
|
|
@@ -4652,7 +4674,7 @@
|
|
|
mapValuesSeries,
|
|
|
memoize,
|
|
|
nextTick,
|
|
|
- parallel,
|
|
|
+ parallel: parallel$1,
|
|
|
parallelLimit,
|
|
|
priorityQueue,
|
|
|
queue: queue$1,
|
|
@@ -4760,7 +4782,7 @@
|
|
|
exports.mapValuesSeries = mapValuesSeries;
|
|
|
exports.memoize = memoize;
|
|
|
exports.nextTick = nextTick;
|
|
|
- exports.parallel = parallel;
|
|
|
+ exports.parallel = parallel$1;
|
|
|
exports.parallelLimit = parallelLimit;
|
|
|
exports.priorityQueue = priorityQueue;
|
|
|
exports.queue = queue$1;
|