首页 > 解决方案 > 如何使用单个 catch 函数进行嵌套异步等待?

问题描述

我有这个代码:

on('connection', async(socket) => {
  try {
    const promises = members.map(async(member) => {
      try {
        const users = await User.find({})
        const _promises = users.map(async() => {
          try {
            //some code here
          } catch (err) {
            console.log(err)
          }
        })
        await Promise.all(_promises)
      } catch (err) {
        console.log(err)
      }
    })
    await Promise.all(promises)
  } catch (err) {
    console.log(err)
    throw err
  }
})

如您所见,我try catch对每个嵌套async函数都有一个。是否可以调整代码以仅使用单个catch,或以某种方式简化事情?

标签: javascriptnode.jserror-handlingpromiseasync-await

解决方案


await您可以在处理程序的顶层只有一个。如果 Promise 在它内部产生的所有链接都链接到一个await在顶层编辑的 Promise(如您的示例中),则该顶部await将捕获内部任何地方抛出的错误。

但是,除非也处理 Promise 拒绝,否则您的catch部分不应出现 throw另一个错误.on,否则您将收到未处理的 Promise 拒绝:

on('connection', async(socket) => {
  try {
    const promises = members.map(async(member) => {
      const users = await User.find({})
      const _promises = users.map(async() => {
        //some code here which may throw
      });
      await Promise.all(_promises);
    });
    await Promise.all(promises);
  } catch (err) {
    console.log(err);
  }
})
  • 如果await User.find抛出,则promises数组将包含一个拒绝的 Promise,这意味着顶部await Promise.all(promises);将抛出并被捕获
  • 如果里面有东西users.map抛出,_promises将包含一个拒绝的 Promise,所以await Promise.all(_promises);也会抛出。但这在const promises = members.map回调内部,所以这也会导致promises包含一个被拒绝的 Promise - 所以它也会被 the 捕获await Promise.all(promises);

推荐阅读