@yoroi/common
Version:
The Common package of Yoroi SDK
69 lines (68 loc) • 1.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.PromiseAllLimited = PromiseAllLimited;
exports.runTasks = runTasks;
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;
}
}
}
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