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(); } })); } })(); }; };