Javascript 使用wait时使用catch处理承诺拒绝

Javascript 使用wait时使用catch处理承诺拒绝,javascript,error-handling,async-await,promise,Javascript,Error Handling,Async Await,Promise,我正在使用wait使代码更干净,但我不确定是否正确处理异常 使用azure devops节点api时的示例 const foo = async() => { return new Promise((resolve, reject) => { ... ... const teams = await coreApiObject.getTeams(currProject.id) .catch

我正在使用
wait
使代码更干净,但我不确定是否正确处理异常

使用azure devops节点api时的示例

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

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

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

foo
函数中,您只需
等待调用
coreApiObject.getTeams(…)
,要捕获并处理任何错误,请使用
try catch

const foo = async() => {
   try {
      const teams = await coreApiObject.getTeams(currProject.id);
      return teams;
   } catch (error) {
      // throw the error
      throw error;
   } 
}
您的代码可以简化为如下所示:

const foo = async() => {
   try {
      const teams = await coreApiObject.getTeams(currProject.id);
      return teams;
   } catch (e) {
      // handle error
   } 
}
如果希望调用代码来处理错误,则可以使用以下选项之一:

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

    删除
    try catch
    块并仅返回对
    coreApiObject.getTeams(…)
    的调用将允许调用代码处理错误,因为
    foo
    函数返回的承诺将解析为
    coreApiObject.getTeams(…)返回的承诺
    :这意味着
    foo
    函数返回的承诺的命运将取决于
    coreApiObject.getTeams(…)
    返回的承诺发生了什么变化

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

  • 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
    函数返回的promise将解析为
    catch
    块返回的任何值

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

    • 异步
      函数总是返回一个承诺,因此您不需要自己显式创建一个承诺。从异步函数返回的任何非承诺值都隐式包装在承诺中

      foo
      函数中,您只需
      等待调用
      coreApiObject.getTeams(…)
      ,要捕获并处理任何错误,请使用
      try catch

      const foo = async() => {
         try {
            const teams = await coreApiObject.getTeams(currProject.id);
            return teams;
         } catch (error) {
            // throw the error
            throw error;
         } 
      }
      
      您的代码可以简化为如下所示:

      const foo = async() => {
         try {
            const teams = await coreApiObject.getTeams(currProject.id);
            return teams;
         } catch (e) {
            // handle error
         } 
      }
      
      如果希望调用代码来处理错误,则可以使用以下选项之一:

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

        删除
        try catch
        块并仅返回对
        coreApiObject.getTeams(…)
        的调用将允许调用代码处理错误,因为
        foo
        函数返回的承诺将解析为
        coreApiObject.getTeams(…)返回的承诺
        :这意味着
        foo
        函数返回的承诺的命运将取决于
        coreApiObject.getTeams(…)
        返回的承诺发生了什么变化

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

      • 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
        函数返回的promise将解析为
        catch
        块返回的任何值

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

      您需要将其包装成一个try-catch块您需要将其包装成一个try-catch块您的意思是,如果我将一个函数作为异步函数并返回一个值,那么该值将自动包装成一个promise对象。对吗?在这种情况下,如果我还希望调用方函数处理exceptionmozilla.org说的“一个承诺,它将用异步函数返回的值来解决,或者用异步函数抛出的异常或其中未捕获的异常来拒绝。”查看更新后的答案。您的意思是,如果我使用异步函数并返回一个值,那么该值将自动包装在promise对象中。对吗?在这种情况下,如果我还希望调用方函数处理exceptionmozilla.org说的“一个承诺,它将用异步函数返回的值来解决,或者用异步函数抛出的异常或其中未捕获的异常来拒绝。”请参阅更新的答案。