首页 > 解决方案 > 在使用 await 时使用 catch 处理 Promise 拒绝

问题描述

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() 将返回拒绝。

标签: javascripterror-handlingasync-awaitpromise

解决方案


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

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函数返回的承诺的命运将取决于任何发生在coreApiObject.getTeams(...).

    如果返回的 promisecoreApiObject.getTeams(...)被拒绝,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返回的承诺将解析为块返回的任何值。asynccatch


推荐阅读