concurrent.js 850 B

12345678910111213141516171819202122232425262728
  1. 'use strict';
  2. var atoa = require('atoa');
  3. var a = require('./a');
  4. var once = require('./once');
  5. var queue = require('./queue');
  6. var errored = require('./errored');
  7. var debounce = require('./debounce');
  8. var CONCURRENTLY = require('./CONCURRENTLY');
  9. module.exports = function concurrent (tasks, concurrency, done) {
  10. if (typeof concurrency === 'function') { done = concurrency; concurrency = CONCURRENTLY; }
  11. var d = once(done);
  12. var q = queue(worker, concurrency);
  13. var keys = Object.keys(tasks);
  14. var results = a(tasks) ? [] : {};
  15. q.unshift(keys);
  16. q.on('drain', function completed () { d(null, results); });
  17. function worker (key, next) {
  18. debounce(tasks[key], [proceed]);
  19. function proceed () {
  20. var args = atoa(arguments);
  21. if (errored(args, d)) { return; }
  22. results[key] = args.shift();
  23. next();
  24. }
  25. }
  26. };