为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以在继续之前等待内部“await”?

是否可以在继续之前等待内部“await”?

繁华开满天机 2023-12-14 15:08:05
我正在编写一个函数,通过查询数据库获取价格,然后将其乘以数量来计算总金额。它对数组中的每一项执行此操作,并将总数推送到一个数组,然后将其减少为返回的最终总数。函数如下图所示:const calculateOrderAmount = async (items: cartProduct[]): Promise<number> => {  const priceArray: number[] = [];  items.forEach(async (p: cartProduct) => {    const product = await Product.findById(p.prodId).exec();    if (product) {      const totalPrice = product.price * p.quantity;      priceArray.push(totalPrice)    } else return;   });  let amount;  if (priceArray.length === 0) amount = 0;  else amount = priceArray.reduce((a, b) => a + b);  return amount;};我遇到的问题是它的异步性。我希望它等待forEach完成,但由于它是异步的,它会继续执行函数的其余部分,因此最终返回 0。有没有办法让它等待完成forEach?或者我应该以不同的方式重写它
查看完整描述

2 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

您可以尝试以下for await of构造:

for await (variable of iterable) {
 statement
}

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of


查看完整回答
反对 回复 2023-12-14
?
慕姐8265434

TA贡献1813条经验 获得超2个赞

通过使用forEach回调,您可以创建一系列单独的承诺,但forEach调用本身不会等待这些承诺。


简单的解决方案是使用循环for,它不使用回调系统:


for (let p: cartProduct of items) {

    const product = await Product.findById(p.prodId).exec();

    if (!product) continue;

    const totalPrice = product.price * p.quantity;

    priceArray.push(totalPrice);

}


查看完整回答
反对 回复 2023-12-14
  • 2 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信