第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

for...of, for await...of 和 Promise.all

for...of, for await...of 和 Promise.all

幕布斯7119047 2023-05-11 15:53:17
對于數(shù)組(產(chǎn)品)中的每個對象(產(chǎn)品),我從貓鼬數(shù)據(jù)庫中獲取價格。該值 (prodDB.price) 與在循環(huán)之前初始化為 0 的“金額”變量相加。我嘗試了其他問題中解釋的 3 種解決方案,其中:對于等待承諾.all--- 對于 --- let amount = 0;      for (const product of products) {     await Product.findById(product._id).exec((err, prodDB)=> {         amount += product.count * prodDB.price;         console.log("Current amount", amount);     }); }; console.log("Amount total", amount);---等待--- let amount = 0;      for await (const product of products) {     Product.findById(product._id).exec((err, prodDB)=> {         amount += product.count * prodDB.price;         console.log("Current amount", amount);     }); }; console.log("Amount total", amount);--- Promise.all ---let amount = 0;await Promise.all(products.map(async (product)=> {    await Product.findById(product._id).exec((err, prodDB)=> {    amount += product.count * prodDB.price;    console.log("Current amount", amount);    });})); console.log("Amount total", amount);任何以前版本的代碼的結(jié)果總是相同的,而且出乎意料,尤其是 console.log 發(fā)生的順序:Amount total 0Current amount 10.29Current amount 17.15Current amount 18.29Current amount 19.45Current amount 43.2你能幫忙嗎?非常感謝!
查看完整描述

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)


查看完整回答
反對 回復(fù) 2023-05-11
?
SMILET

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

}));


查看完整回答
反對 回復(fù) 2023-05-11
  • 2 回答
  • 0 關(guān)注
  • 251 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號