1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768 |
- "use strict";
- const processAsyncTree = (items, concurrency, processor, callback) => {
- const queue = Array.from(items);
- if (queue.length === 0) return callback();
- let processing = 0;
- let finished = false;
- let processScheduled = true;
-
- const push = item => {
- queue.push(item);
- if (!processScheduled && processing < concurrency) {
- processScheduled = true;
- process.nextTick(processQueue);
- }
- };
-
- const processorCallback = err => {
- processing--;
- if (err && !finished) {
- finished = true;
- callback(err);
- return;
- }
- if (!processScheduled) {
- processScheduled = true;
- process.nextTick(processQueue);
- }
- };
- const processQueue = () => {
- if (finished) return;
- while (processing < concurrency && queue.length > 0) {
- processing++;
- const item = (queue.pop());
- processor(item, push, processorCallback);
- }
- processScheduled = false;
- if (queue.length === 0 && processing === 0 && !finished) {
- finished = true;
- callback();
- }
- };
- processQueue();
- };
- module.exports = processAsyncTree;
|