@yoroi/common
Version:
The Common package of Yoroi SDK
56 lines (55 loc) • 1.49 kB
JavaScript
;
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