亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

處理Promise.all中的錯誤-承諾拒絕+類型錯誤

處理Promise.all中的錯誤-承諾拒絕+類型錯誤

幕布斯6054654 2021-04-16 17:19:08
我有幾個Promise.all功能:const fn = async () => {   await Promise.all(first());   await Promise.all(second());   await Promise.all(third());}first,second并且third功能看起來幾乎一樣。first 功能:const first = async () => {   const oldUsers = await User.find(...);   return Array.isArray(oldUsers) ? oldUsers.map(async (user) => {      await User.updateOne({ _id: user._id }, { ... });      await transporter.sendMail(sendMail(user));   }) : [];};我的問題:啟動應用程序并調用fn函數時,只有第一個Promise.all成功(用戶已更新并發送郵件),但second和third甚至沒有被調用。在控制臺中,出現錯誤:UnhandledPromiseRejectionWarning: TypeError: undefined is not a function我整日都在掙扎,該怎么辦,所以這三個Promise.all都成功完成了嗎?尋求幫助,在此先謝謝您。
查看完整描述

1 回答

?
蕭十郎

TA貢獻1815條經驗 獲得超13個贊

您的問題是Promise.all需要一系列承諾,但是您的first()功能是async,因此會返回某些承諾。這個承諾是不可迭代的,因此Promise.all失敗了。你可以通過做來解決


await Promise.all(await first());

但實際上您應該將Promise.all移入first函數本身:


async function first() {

  const oldUsers = await User.find(...);


  return Array.isArray(oldUsers)

    ? Promise.all(oldUsers.map(async (user) => {

        await User.updateOne({ _id: user._id }, { ... });

        await transporter.sendMail(sendMail(user));

      }))

    : [];

}

async function fn() {

   await first();

   await second();

   await third();

}


查看完整回答
反對 回復 2021-04-22
  • 1 回答
  • 0 關注
  • 244 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號