asyncEachOfLimit.js
 1  'use strict';
 2  
 3  Object.defineProperty(exports, "__esModule", {
 4      value: true
 5  });
 6  exports.default = asyncEachOfLimit;
 7  
 8  var _breakLoop = require('./breakLoop');
 9  
10  var _breakLoop2 = _interopRequireDefault(_breakLoop);
11  
12  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
13  
14  // for async generators
15  function asyncEachOfLimit(generator, limit, iteratee, callback) {
16      let done = false;
17      let canceled = false;
18      let awaiting = false;
19      let running = 0;
20      let idx = 0;
21  
22      function replenish() {
23          //console.log('replenish')
24          if (running >= limit || awaiting || done) return;
25          //console.log('replenish awaiting')
26          awaiting = true;
27          generator.next().then(({ value, done: iterDone }) => {
28              //console.log('got value', value)
29              if (canceled || done) return;
30              awaiting = false;
31              if (iterDone) {
32                  done = true;
33                  if (running <= 0) {
34                      //console.log('done nextCb')
35                      callback(null);
36                  }
37                  return;
38              }
39              running++;
40              iteratee(value, idx, iterateeCallback);
41              idx++;
42              replenish();
43          }).catch(handleError);
44      }
45  
46      function iterateeCallback(err, result) {
47          //console.log('iterateeCallback')
48          running -= 1;
49          if (canceled) return;
50          if (err) return handleError(err);
51  
52          if (err === false) {
53              done = true;
54              canceled = true;
55              return;
56          }
57  
58          if (result === _breakLoop2.default || done && running <= 0) {
59              done = true;
60              //console.log('done iterCb')
61              return callback(null);
62          }
63          replenish();
64      }
65  
66      function handleError(err) {
67          if (canceled) return;
68          awaiting = false;
69          done = true;
70          callback(err);
71      }
72  
73      replenish();
74  }
75  module.exports = exports['default'];