我有以下代码:

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还是以某种方式简化操作?

最佳答案

您只能在处理程序的顶层使用一个await。如果在其中产生的Promises都链接到一个在顶层await编码的Promise(如您的示例),则该顶层await将捕获内部任何地方抛出的错误。

但是,除非catch也处理Promise拒绝,否则您的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,该Promise拒绝,这意味着顶部await Promise.all(promises);将抛出并被
  • 捕获
  • 如果users.map中的某些东西抛出,则_promises将包含一个拒绝的Promise,因此await Promise.all(_promises);将抛出。但这是在const promises = members.map回调内部,因此这也会导致promises也包含被拒绝的Promise-因此它也将被await Promise.all(promises);捕获。
  • 关于javascript - 如何对嵌套异步等待使用单一捕获功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56233161/

    10-12 02:26