我正在编写一个函数,该函数通过查询数据库以获取价格,然后将其乘以数量来计算总的$金额。它对数组中的每个项目执行此操作,然后将总数推送到一个数组中,然后将其减少为一个最终的总数,然后将其返回。功能如下图所示:
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
完成?还是应该以其他方式重写它
通过使用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);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句