Я думаю, что мой подход к r
будет следующим:
async function r() {
const results = {};
const promises = [];
for (let i = 0; i < 2; i++) {
const key = `k${i}`
promises.push(t(key).then(value => results[key] = value));
}
await Promise.all(promises);
return results;
}
Обратите внимание, как results
заполняется в l oop (асинхронно), мы используем только promises
, поэтому мы знаем, когда все сделано (или, конечно, что-то не получилось). При этом ключ и значение хранятся в теле l oop.
Живая копия:
// No need for p1 and p2 to be `asycn` since they don't
// use `await`; I'm guessing your real functions do
// (and don't use `new Promise`)
/*async*/ function p1(x) {
return new Promise((resolve) => {
setTimeout(() => {
resolve(`p1-${x}`);
}, 250);
});
}
/*async*/ function p2(x) {
return new Promise((resolve) => {
setTimeout( () => {
resolve(`p2-${x}`);
}, 250);
});
}
async function t(n) {
return { a: await p1(n), b: await p2(n), c: n };
}
async function r() {
const results = {};
const promises = [];
for (let i = 0; i < 2; i++) {
const key = `k${i}`
promises.push(t(key).then(value => results[key] = value));
}
await Promise.all(promises);
return results;
}
(async () => {
const answers = await r();
console.log('answers', answers);
})().catch((e) => {
console.log(e);
});
.as-console-wrapper {
max-height: 100% !important;
}