查看下面的代碼
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, result: "id1 is fully complete" }
uj5u.com熱心網友回復:
const result = ids.map(async (id) => {
return {
id,
result: test(id),
};
});
你await在這里少了一個。test 將回傳一個promise,并且您將該promise 分配給result,但是您希望等待promise 解決并分配值。
const result = ids.map(async (id) => {
return {
id,
result: await test(id),
};
});
您仍將創建一組 Promise(因為異步函式回傳 Promise),但現在 Promise 決議為其中沒有 Promise 的物件。
uj5u.com熱心網友回復:
問題
傳遞的專案Promise.all必須是承諾,但你傳遞的物件是{ id: 1, result: Promise { <pending> } }
解決方案
首先將 promise 傳遞給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);
uj5u.com熱心網友回復:
您可以以更清晰和更短的方式完成整個事情:
const test = async (id) => {
const result = await new Promise((resolve) => {
setTimeout(() => resolve(` ${id} finished`), 1000);
});
return {result};
};
Promise.all([3,5,7,2,4,6].map(test)).then(console.log)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/506182.html
標籤:javascript
