; | |
Object.defineProperty(exports, "__esModule", { | |
value: true | |
}); | |
exports.default = asyncEachOfLimit; | |
var _breakLoop = require('./breakLoop.js'); | |
var _breakLoop2 = _interopRequireDefault(_breakLoop); | |
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } | |
// for async generators | |
function asyncEachOfLimit(generator, limit, iteratee, callback) { | |
let done = false; | |
let canceled = false; | |
let awaiting = false; | |
let running = 0; | |
let idx = 0; | |
function replenish() { | |
//console.log('replenish') | |
if (running >= limit || awaiting || done) return; | |
//console.log('replenish awaiting') | |
awaiting = true; | |
generator.next().then(({ value, done: iterDone }) => { | |
//console.log('got value', value) | |
if (canceled || done) return; | |
awaiting = false; | |
if (iterDone) { | |
done = true; | |
if (running <= 0) { | |
//console.log('done nextCb') | |
callback(null); | |
} | |
return; | |
} | |
running++; | |
iteratee(value, idx, iterateeCallback); | |
idx++; | |
replenish(); | |
}).catch(handleError); | |
} | |
function iterateeCallback(err, result) { | |
//console.log('iterateeCallback') | |
running -= 1; | |
if (canceled) return; | |
if (err) return handleError(err); | |
if (err === false) { | |
done = true; | |
canceled = true; | |
return; | |
} | |
if (result === _breakLoop2.default || done && running <= 0) { | |
done = true; | |
//console.log('done iterCb') | |
return callback(null); | |
} | |
replenish(); | |
} | |
function handleError(err) { | |
if (canceled) return; | |
awaiting = false; | |
done = true; | |
callback(err); | |
} | |
replenish(); | |
} | |
module.exports = exports.default; |