Promise Pool With Ordered Results
Run many async tasks with a fixed concurrency limit while keeping results in input order and rejecting invalid pool sizes.
Code
export function mapPool(items, mapper, concurrency = 4) {
if (!Array.isArray(items)) throw new TypeError("items must be an array");
if (typeof mapper !== "function") throw new TypeError("mapper must be a function");
if (!Number.isInteger(concurrency) || concurrency < 1) {
throw new RangeError("concurrency must be a positive integer");
}
const results = new Array(items.length);
let nextIndex = 0;
async function worker() {
while (nextIndex < items.length) {
const index = nextIndex;
nextIndex += 1;
results[index] = await mapper(items[index], index);
}
}
const workerCount = Math.min(concurrency, items.length);
const workers = Array.from({ length: workerCount }, () => worker());
return Promise.all(workers).then(() => results);
}Report a problem with this exampleOpens a pre-filled issue on GitHub.