2 回答
TA贡献1815条经验 获得超13个赞
问题是您混合了“回调”模式和“等待”模式。要么await操作,要么给它一个回调,否则它会变得混乱。
for (const product of products) {
let prodDB = await Product.findById(product._id).lean().exec(); // add lean() to get only JSON data, lighter and faster
amount += product.count * prodDB.price;
console.log("Current amount", amount);
};
然而,这是非常昂贵的,因为如果您有 10 个产品,您将调用数据库 10 次。最好只调用一次并一次获取所有 _id。
let allIds = products.map(p => p._id),
prodDBs = await Product.find({
_id: {
$in: allIds
}
})
.lean()
.exec()
const amount = prodDBs.reduce((a,b) => a.price + b.price, 0)
TA贡献1796条经验 获得超4个赞
我会使用Promise.all这样你就可以并行运行所有的数据库请求并等待它们全部完成,而不是依次运行它们。我认为唯一的问题是.exec()不返回 a Promise,只使用findById()它返回一个 Promise,试试这个代码:
let amount = 0;
await Promise.all(products.map(async (product)=> {
const prodDB = await Product.findById(product._id)
amount += product.count * prodDB.price
}));
添加回答
举报