js-hub / utils /promisesQueue.ts
coyotte508's picture
coyotte508 HF Staff
Add 1 files
21dd449 verified
/**
* Execute queue of promises.
*
* Inspired by github.com/rxaviers/async-pool
*/
export async function promisesQueue<T>(factories: (() => Promise<T>)[], concurrency: number): Promise<T[]> {
const results: T[] = [];
const executing: Set<Promise<void>> = new Set();
let index = 0;
for (const factory of factories) {
const closureIndex = index++;
const e = factory().then((r) => {
results[closureIndex] = r;
executing.delete(e);
});
executing.add(e);
if (executing.size >= concurrency) {
await Promise.race(executing);
}
}
await Promise.all(executing);
return results;
}