2 回答

TA貢獻(xiàn)1815條經(jīng)驗 獲得超13個贊
問題是您混合了“回調(diào)”模式和“等待”模式。要么await操作,要么給它一個回調(diào),否則它會變得混亂。
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 個產(chǎn)品,您將調(diào)用數(shù)據(jù)庫 10 次。最好只調(diào)用一次并一次獲取所有 _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貢獻(xiàn)1796條經(jīng)驗 獲得超4個贊
我會使用Promise.all這樣你就可以并行運行所有的數(shù)據(jù)庫請求并等待它們?nèi)客瓿桑皇且来芜\行它們。我認(rèn)為唯一的問題是.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
}));
添加回答
舉報