ks3
Version:
本代码库为`金山云存储KS3`服务.主要提供`KS3 nodejs SDK`和`命令行工具`.
73 lines (63 loc) • 1.9 kB
JavaScript
/**
* @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;