diff options
Diffstat (limited to 'lib/utils')
-rw-r--r-- | lib/utils/batch.js | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/lib/utils/batch.js b/lib/utils/batch.js new file mode 100644 index 0000000..5b92be5 --- /dev/null +++ b/lib/utils/batch.js @@ -0,0 +1,51 @@ +var Q = require("q"); +var _ = require("lodash"); + +// Execute a method for all element +function execEach(items, options) { + var concurrents = 0, d = Q.defer(), pending = []; + + options = _.defaults(options || {}, { + max: 100, + fn: function(item) {} + }); + + + function startItem(item, i) { + if (concurrents >= options.max) { + pending.push([item, i]); + return; + } + + concurrents++; + Q() + .then(function() { + return options.fn(item, i); + }) + .then(function() { + concurrents--; + + // Next pending + var next = pending.shift(); + + if (concurrents == 0 && !next) { + d.resolve(); + } else if (next) { + startItem.apply(null, next); + } + }) + .fail(function(err) { + pending = []; + d.reject(err); + }) + } + + _.each(items, startItem); + + return d.promise; +} + +module.exports = { + execEach: execEach +}; + |