UNPKG

@yoroi/common

Version:

The Common package of Yoroi SDK

62 lines 1.75 kB
export function runTasks(taskIterator) { try { let maxConcurrency = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : initialMaxConcurrency; return async function* () { 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); }(); } catch (e) { return Promise.reject(e); } } 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) { let maxConcurrency = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 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