UNPKG

@yoroi/common

Version:
56 lines (55 loc) 1.49 kB
"use strict"; export async function* runTasks(taskIterator, maxConcurrency = initialMaxConcurrency) { async function* workerMaker() { for (const task of taskIterator) { yield await task(); } } const asyncIterators = []; for (let i = 0; i < maxConcurrency; i++) { asyncIterators.push(workerMaker()); } yield* raceAsyncIterators(asyncIterators); } async function* raceAsyncIterators(asyncIterators) { async function nextResultWithItsIterator(iterator) { return { result: await iterator.next(), iterator }; } const promises = new Map(); for (const iterator of asyncIterators) { promises.set(iterator, nextResultWithItsIterator(iterator)); } while (promises.size) { const { result, iterator } = await Promise.race(promises.values()); if (result.done) { promises.delete(iterator); } else { promises.set(iterator, nextResultWithItsIterator(iterator)); yield result.value; } } } export function PromiseAllLimited(tasks, maxConcurrency = initialMaxConcurrency) { return new Promise((resolve, reject) => { const results = []; const runner = async () => { try { for await (const result of runTasks(tasks.values(), maxConcurrency)) { results.push(result); } resolve(results); } catch (error) { reject(error); } }; runner(); }); } const initialMaxConcurrency = 3; //# sourceMappingURL=promises.js.map