mirror of https://github.com/jkjoy/sunpeiwen.git
60 lines
1.1 KiB
JavaScript
60 lines
1.1 KiB
JavaScript
|
var eachLimit = function (arr, limit, iterator, callback) {
|
||
|
callback = callback || function () {};
|
||
|
if (!arr.length || limit <= 0) {
|
||
|
return callback();
|
||
|
}
|
||
|
|
||
|
var completed = 0;
|
||
|
var started = 0;
|
||
|
var running = 0;
|
||
|
|
||
|
(function replenish() {
|
||
|
if (completed >= arr.length) {
|
||
|
return callback();
|
||
|
}
|
||
|
|
||
|
while (running < limit && started < arr.length) {
|
||
|
started += 1;
|
||
|
running += 1;
|
||
|
iterator(arr[started - 1], function (err) {
|
||
|
if (err) {
|
||
|
callback(err);
|
||
|
callback = function () {};
|
||
|
} else {
|
||
|
completed += 1;
|
||
|
running -= 1;
|
||
|
if (completed >= arr.length) {
|
||
|
callback();
|
||
|
} else {
|
||
|
replenish();
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
}
|
||
|
})();
|
||
|
};
|
||
|
|
||
|
var retry = function (times, iterator, callback) {
|
||
|
var next = function (index) {
|
||
|
iterator(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;
|