eachOfLimit.js 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. 'use strict';
  2. Object.defineProperty(exports, "__esModule", {
  3. value: true
  4. });
  5. exports.default = _eachOfLimit;
  6. var _noop = require('lodash/noop');
  7. var _noop2 = _interopRequireDefault(_noop);
  8. var _once = require('./once');
  9. var _once2 = _interopRequireDefault(_once);
  10. var _iterator = require('./iterator');
  11. var _iterator2 = _interopRequireDefault(_iterator);
  12. var _onlyOnce = require('./onlyOnce');
  13. var _onlyOnce2 = _interopRequireDefault(_onlyOnce);
  14. function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
  15. function _eachOfLimit(limit) {
  16. return function (obj, iteratee, callback) {
  17. callback = (0, _once2.default)(callback || _noop2.default);
  18. if (limit <= 0 || !obj) {
  19. return callback(null);
  20. }
  21. var nextElem = (0, _iterator2.default)(obj);
  22. var done = false;
  23. var running = 0;
  24. function iterateeCallback(err) {
  25. running -= 1;
  26. if (err) {
  27. done = true;
  28. callback(err);
  29. } else if (done && running <= 0) {
  30. return callback(null);
  31. } else {
  32. replenish();
  33. }
  34. }
  35. function replenish() {
  36. while (running < limit && !done) {
  37. var elem = nextElem();
  38. if (elem === null) {
  39. done = true;
  40. if (running <= 0) {
  41. callback(null);
  42. }
  43. return;
  44. }
  45. running += 1;
  46. iteratee(elem.value, elem.key, (0, _onlyOnce2.default)(iterateeCallback));
  47. }
  48. }
  49. replenish();
  50. };
  51. }
  52. module.exports = exports['default'];