
Security News
The Hidden Blast Radius of the Axios Compromise
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.
English | 中文
Make promises run in parallel with a limit amount.
npm install p-parallel --save
pParallel(functionArr, parallelLimit)
functionArr:Array,an array of functions those return a promise.parallelLimit:Number,the max amount of running promises in parallel.The method returns a single Promise. This promise will run all of the functions passed as functionArr in parallel asynchronously under the control of the max amount of running promises by parallelLimit. This promise fulfills when all of the promises returned by functions in functionArr have been fulfilled. It rejects with the reason of the first promise that rejects.
This method can be useful for do something in parallel with limited source, such as sending requests in parallel with a limit amount.
Promise.all()Promise.all() takes an iterable of promises as an input, while pParallel() takes an array of functions those return a promise.Promise.all(promiseArr) runs all the promises in promiseArr in parallel asynchronously, pParallel(promiseArr, parallelLimit) runs under the control of the max amount of running promises by parallelLimit and in the order of FIFO.const pParallel = require('p-parallel');
function task(data, delay, success = true) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (success) {
resolve(data);
} else {
reject(data);
}
}, delay);
});
}
function test(functionArr) {
pParallel(functionArr, 2).then(res => console.log('success:', res), res => console.log('fail:', res));
}
function success1() {
return task('success1', 4000);
}
function success2() {
return task('success2', 2000);
}
function success3() {
return task('success3', 2000);
}
function fail1() {
return task('fail1', 2000, false);
}
function fail2() {
return task('fail2', 4000, false);
}
// this will print 'success: success1, success2, success3' after 4000ms
test([success1, success2, success3]);
// this will print 'fail: fail1' after 2000ms
test([success1, success2, fail]);
Sometimes, we need to catch exceptions to keep all promises in functionArr done. We can use .catch.
const pParallel = require('p-parallel');
function task(data, delay, success = true) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (success) {
resolve(data);
} else {
reject(data)
}
}, delay);
});
}
function test(functionArr) {
pParallel(functionArr, 2).then(res => console.log('success:', res), res => console.log('fail:', res));
}
function success1() {
return task('success1', 4000);
}
function success2() {
return task('success2', 2000);
}
function fail1() {
return task('fail1', 2000, false).catch(data => data);
}
// this will print 'success: success1, success2, fail1' after 4000ms
test([success1, success2, fail]);
const pParallel = require('p-parallel');
// Personally, I think it's a more elegant way.
Promise.parallel = pParallel;
FAQs
Make promises run in parallel with a limit amount.
We found that p-parallel demonstrated a not healthy version release cadence and project activity because the last version was released a year ago. It has 1 open source maintainer collaborating on the project.
Did you know?

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Security News
The Axios compromise shows how time-dependent dependency resolution makes exposure harder to detect and contain.

Research
A supply chain attack on Axios introduced a malicious dependency, plain-crypto-js@4.2.1, published minutes earlier and absent from the project’s GitHub releases.

Research
Malicious versions of the Telnyx Python SDK on PyPI delivered credential-stealing malware via a multi-stage supply chain attack.