如何使用promise.all()来等待对象中的promise完全完成



查看下方的代码

const test = async (id) => {
const result = await new Promise((resolve) => {
setTimeout(() => resolve(` ${id} finished`), 1000);
});
const output = {
result,
};
return output;
};
async function output(ids) {
const result = ids.map(async (id) => {
return {
id,
result: test(id),
};
});
const output = await Promise.all(result);
console.log(output); // should output no promises in the object
return output;
}
const ids = [1, 2, 3, 4, 5, 6, 7, 8, 9];
output(ids);

输出为:

[
{ id: 1, result: Promise { <pending> } },
{ id: 2, result: Promise { <pending> } },
{ id: 3, result: Promise { <pending> } },
{ id: 4, result: Promise { <pending> } },
{ id: 5, result: Promise { <pending> } },
{ id: 6, result: Promise { <pending> } },
{ id: 7, result: Promise { <pending> } },
{ id: 8, result: Promise { <pending> } },
{ id: 9, result: Promise { <pending> } }
]

有没有办法等到承诺完全完成?我希望输出结果不是承诺。不确定是否有快速解决方案。我不想放await test(id)

例如,{id:1,结果:"id1完全完整"}

const result = ids.map(async (id) => {
return {
id,
result: test(id),
};
});

你这里少了一个await。测试将返回一个promise,您将该promise分配给result,但您希望等待promise解析,然后分配值。

const result = ids.map(async (id) => {
return {
id,
result: await test(id),
};
});

您仍将创建一个promise数组(因为异步函数返回promise(,但现在promise解析为其中没有promise的对象。

问题

传递给Promise.all的项目必须是promise,但您传递的对象类似于{ id: 1, result: Promise { <pending> } }

解决方案

首先将承诺传递给Promise.all,然后映射它们。

const test = async (id) => {
const result = await new Promise((resolve) => {
setTimeout(() => resolve(` ${id} finished`), 1000);
});
const output = {
result,
};
return output;
};
async function output(ids) {
const promises = ids.map(id => test(id))
const resolved = await Promise.all(promises)
const mapped = resolved.map((result, index) => ({
...result,
id: ids[index]
}))
return mapped
}
const ids = [1, 2, 3, 4, 5, 6, 7, 8, 9];
output(ids).then(console.log);

您可以用更清晰、更短的方式完成整个过程:

const test = async (id) =>(
{id, 
result:await new Promise(res =>setTimeout(() => res(` ${id} finished`), 1000))
}
);

Promise.all([3,5,7,2,4,6].map(test)).then(console.log)

最新更新