【发布时间】:2021-12-30 09:24:04
【问题描述】:
我正在通过这个 dummyAssests 数组进行映射,并希望根据名为 newAssetArray 的 axios 响应创建一个新的对象数组。但是当我 console.log 时 newAssetArray 它只包含一个 Promises 数组......
useEffect(() => {
let newAssetArray = dummyAssets.map(async function (asset) {
return await axios
.get(currrentPrice(asset.asset_id))
.then((response) => {
let cp = response.data.market_data.current_price.eur;
let value = Number(cp) * Number(asset.amount);
return { ...asset, value: +value };
})
.catch((error) => console.log(error.response.data.error));
});
setAssets(newAssetArray);
console.log(newAssetArray);
}, [dummyAssets]);
控制台:
【问题讨论】:
-
是的,这是意料之中的。使用
Promise.all()等待所有的承诺解决。.map()本身没有承诺意识,因此它不会“等待”其循环的每个单独迭代在进入下一个迭代之前解决。所以,你有调用 N 个async函数的结果,它们都返回一个承诺作为你的.map()结果。这就是代码应该如何工作的方式。await您正在使用它没有完成任何事情。如果您改用for循环(这是可感知的,那么您的循环将被排序。 -
谢谢。你能举例说明如何使用 Promise.all() 吗?