45 lines
1.3 KiB
JavaScript
45 lines
1.3 KiB
JavaScript
var once = require('async.util.once');
|
|
var noop = require('async.util.noop');
|
|
var onlyOnce = require('async.util.onlyonce');
|
|
var keyIterator = require('async.util.keyiterator');
|
|
|
|
module.exports = function eachOfLimit(limit) {
|
|
return function(obj, iterator, cb) {
|
|
cb = once(cb || noop);
|
|
obj = obj || [];
|
|
var nextKey = keyIterator(obj);
|
|
if (limit <= 0) {
|
|
return cb(null);
|
|
}
|
|
var done = false;
|
|
var running = 0;
|
|
var errored = false;
|
|
|
|
(function replenish() {
|
|
if (done && running <= 0) {
|
|
return cb(null);
|
|
}
|
|
|
|
while (running < limit && !errored) {
|
|
var key = nextKey();
|
|
if (key === null) {
|
|
done = true;
|
|
if (running <= 0) {
|
|
cb(null);
|
|
}
|
|
return;
|
|
}
|
|
running += 1;
|
|
iterator(obj[key], key, onlyOnce(function(err) {
|
|
running -= 1;
|
|
if (err) {
|
|
cb(err);
|
|
errored = true;
|
|
} else {
|
|
replenish();
|
|
}
|
|
}));
|
|
}
|
|
})();
|
|
};
|
|
};
|