12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- 'use strict';
- const pTry = require('p-try');
- module.exports = concurrency => {
- if (concurrency < 1) {
- throw 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
- }
- });
- return generator;
- };
|