繁体   English   中英

如何对嵌套异步等待使用单个catch函数?

[英]How to use single catch function for nested async await?

我有以下代码:

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应该throw ,除非另一个错误.on处理无极拒绝为好,否则你会得到一个未处理的承诺拒绝:

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包含被拒绝的await Promise.all(promises);因此它将被await Promise.all(promises);捕获await Promise.all(promises); 也一样

如果您调用的函数引发错误,该错误将退回到该函数调用所在的最近的catch块。

try {

   throw "an error";

}
catch(e) {
   console.log(e);   //output: "an error"
}

现在考虑一下

try {

  try {

   throw "an error";

  }
  catch(e) {

    console.log(e);   //output: "an error"

  }

}
catch(e) {
   console.log(e);   //This line is not going to be executed
}

这种机制可以将更多错误信息附加到每个级别中生成的错误中。 假设您的错误是一个对象,并且每个嵌套的catch bock都将自己的信息附加到错误对象,然后再次抛出该错误对象。

看下面的代码:

尝试{

  try {

   throw {internalError: 101};

  }
  catch(e) {

    //Attach more info and throw again 
    e.additionalInfo = 'Disconnected when gathering information';
    throw e;

  }

}
catch(e) {
   e.message = 'Cannot get information'
   console.log(e);   //Final error with lot of information
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM