You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
'use strict'; const pTry = require('p-try');
const pLimit = concurrency => { if (!((Number.isInteger(concurrency) || concurrency === Infinity) && concurrency > 0)) { return Promise.reject(new TypeError('Expected `concurrency` to be a number from 1 and up')); }
const queue = []; let activeCount = 0;
const next = () => { activeCount--;
if (queue.length > 0) { queue.shift()(); } };
const run = (fn, resolve, ...args) => { activeCount++;
const result = pTry(fn, ...args);
resolve(result);
result.then(next, next); };
const enqueue = (fn, resolve, ...args) => { if (activeCount < concurrency) { run(fn, resolve, ...args); } else { queue.push(run.bind(null, fn, resolve, ...args)); } };
const generator = (fn, ...args) => new Promise(resolve => enqueue(fn, resolve, ...args)); Object.defineProperties(generator, { activeCount: { get: () => activeCount }, pendingCount: { get: () => queue.length }, clearQueue: { value: () => { queue.length = 0; } } });
return generator; };
module.exports = pLimit; module.exports.default = pLimit;
|