12345678910111213141516171819202122232425262728293031323334353637383940414243 |
- '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()();
- }
- };
-
- return fn => new Promise((resolve, reject) => {
- const run = () => {
- activeCount++;
-
- pTry(fn).then(
- val => {
- resolve(val);
- next();
- },
- err => {
- reject(err);
- next();
- }
- );
- };
-
- if (activeCount < concurrency) {
- run();
- } else {
- queue.push(run);
- }
- });
- };
|