UNPKG

ks3

Version:

本代码库为`金山云存储KS3`服务.主要提供`KS3 nodejs SDK`和`命令行工具`.

73 lines (63 loc) 1.9 kB
/** * @param {Array|Iterable|AsyncIterable|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`. * @param {Function} [callback] - A callback which is called when all * `iteratee` functions have finished, or an error occurs. Invoked with (err). */ var eachLimit = function (coll, limit, iteratee, callback) { callback = callback || function () {}; if (!coll.length || limit <= 0) { return callback(); } var completed = 0; var started = 0; var running = 0; var isError = false; (function replenish () { if (completed >= coll.length) { return callback(); } while (running < limit && started < coll.length && !isError) { started += 1; running += 1; iteratee(coll[started - 1], function (err) { if (err) { callback(err); callback = function () {}; isError = true } else { completed += 1; running -= 1; if (completed >= coll.length) { callback(); } else { replenish() } } }); } })(); }; var retry = function (times, iteratee, callback) { var next = function (index) { iteratee(function (err, data) { if (err && index < times) { next(index + 1); } else { callback(err, data); } }); }; if (times < 1) { callback(); } else { next(1); } }; var async = { eachLimit: eachLimit, retry: retry }; module.exports = async;