为了账号安全,请及时绑定邮箱和手机立即绑定

处理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 关注
  • 209 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信