75 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			75 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
'use strict';
 | 
						|
 | 
						|
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; |