【问题标题】:Handling Promise rejection with catch while using await在使用 await 时使用 catch 处理 Promise 拒绝
【发布时间】:2021-06-06 14:53:45
【问题描述】:

我正在使用await 使代码更简洁,但我不确定我是否正确处理了异常。

使用 azure-devops-node-api 的示例;

const foo = async() => {
    return new Promise((resolve, reject) => {
        ...
        ...
        const teams = await coreApiObject.getTeams(currProject.id)
                      .catch(err => { reject(err)  return })
        ...
        ...
    })  
}

我假设在这段代码中,如果 promise 调用出现问题,foo() 将返回拒绝。

【问题讨论】:

  • 你需要把它包装到一个 try catch 块中

标签: javascript error-handling async-await promise


【解决方案1】:

async 函数总是返回一个承诺,所以你不需要自己显式地创建一个。从异步函数返回的任何非承诺值都隐含在承诺中。

foo 函数中,您只需await 调用coreApiObject.getTeams(...) 并捕获和处理任何错误,使用try-catch 块。

您的代码可以简化如下:

const foo = async() => {
   try {
      const teams = await coreApiObject.getTeams(currProject.id);
      return teams;
   } catch (e) {
      // handle error
   } 
}

如果您希望调用代码来处理错误,那么您可以使用以下选项之一:

  • 删除try-catch 块,只返回coreApiObject.getTeams(...) 的结果。

    const foo = async() => {
       return coreApiObject.getTeams(currProject.id);
    }
    

    删除try-catch 块并仅返回对coreApiObject.getTeams(...) 的调用将允许调用代码处理错误,因为foo 函数返回的承诺将解析到承诺coreApiObject.getTeams(...) 返回:这意味着 foo 函数返回的 Promise 的命运将取决于 coreApiObject.getTeams(...) 返回的 Promise 发生的任何事情。

    如果coreApiObject.getTeams(...) 返回的promise 被拒绝,foo 函数返回的promise 也将被拒绝,因此调用代码将进行更改以捕获promise 拒绝并处理它。

  • catch 块中抛出错误。

    const foo = async() => {
       try {
          const teams = await coreApiObject.getTeams(currProject.id);
          return teams;
       } catch (error) {
          // throw the error
          throw error;
       } 
    }
    

    您需要从catch 块中抛出错误,以确保async 函数返回的承诺被拒绝;如果您从catch 块返回一个值,则async 函数返回的承诺将解析catch 块返回的任何值。

【讨论】:

  • 您的意思是,如果我将函数作为异步调用并返回一个值,则该值将自动包装在一个 Promise 对象中。对吗?
  • 在这种情况下,如果我也希望调用者函数处理异常怎么办
  • mozilla.org 说:“一个 Promise,它将使用异步函数返回的值来解决,或者被异步函数抛出或未被捕获的异常拒绝。”
猜你喜欢
  • 2017-04-23
  • 2019-02-28
  • 1970-01-01
  • 2018-08-26
  • 1970-01-01
  • 2017-06-02
  • 1970-01-01
  • 2016-11-10
  • 2021-08-02
相关资源
最近更新 更多