, Jonas , . :
- ( ).
- , , , ,
Promise.all .
function parallelMap(values, workFn, maxConcurrency = 2) {
const length = values.length;
const results = Array.from({ length });
let pos = 0;
let completed = 0;
return new Promise(resolve => {
function work() {
if (completed === length) {
return resolve(results);
}
if (pos >= length) {
return;
}
const workIndex = pos;
const item = values[workIndex];
pos = pos + 1;
return workFn(item, workIndex)
.then(result => {
results[workIndex] = result;
completed = completed + 1;
work();
})
.catch(result => {
results[workIndex] = result;
completed = completed + 1;
work();
});
}
for (let i = 0; i < maxConcurrency; i++) {
work();
}
});
}
:
async function fakeRequest({ value, time = 100, shouldFail = false }) {
return new Promise((resolve, reject) => {
setTimeout(() => {
if (shouldFail) {
reject("Failure: " + value);
} else {
resolve("Success: " + value);
}
}, time);
});
}
test("basic 'working' prototype", async () => {
const values = [1, 2, 3, 4, 5, 6];
const results = await parallelMap(values, value => {
return fakeRequest({ value, time: 100, shouldFail: value % 2 === 0 });
});
expect(results).toEqual([
"Success: 1",
"Failure: 2",
"Success: 3",
"Failure: 4",
"Success: 5",
"Failure: 6"
]);
}, 350);
.