在async/await的catch处理程序中使用Promise.reject()

5

我只是想知道使用以下代码是否是一个好习惯:

   const myFun = async () => {
     try {
         const response = await api();
         if(response.status === 200) {
            return response.data;
         }
      } catch(err) {
         return Promise.reject(err);
      }
   }

在这里,myFun将返回一个已解决/reject的Promise,该Promise将被另一个函数捕获。我只是想知道这是否是正确的方式,或者是否有其他选择?


对于标记为异步的函数,正确的方式是使用 throw - slebetman
当 Promise 解决时,但状态码不是 200 时,您希望发生什么?现在当这种情况发生时,您正在使用 undefined 进行解决,这可能不是您想要的。 - jfriend00
2个回答

4

尝试从api()重新抛出错误不会有任何作用。

如果使用async函数,当发生错误时将隐式调用Promise.reject(error)

只需像这样编写您的函数:

const myFun = async () => {
     const response = await api();
     if (response.status === 200) {
          return response.data;
     }
     // You might want to return something else here
}

那么调用函数仍将接收到错误信息:

try {
    await myFun();
} catch (error) {
    // error still received
}

1
你所做的是混合使用async/await和Promises。你可以在catch块中直接抛出err。
const myFun = async () => {
     try {
         const response = await api();
         if(response.status === 200) {
            return response.data;
         }
      } catch(err) {
         throw err;
      }
   }

在这之后,你可以在调用myFun的任何地方捕获错误。

两种情况下的最终结果都是相同的。唯一的区别是throw可以在JS代码中的任何位置使用,但Promise.reject只能在异步代码块内部调用。


2
你的 throw err 并不比 return Promise.reject(err) 更好。它们实现的效果是完全相同的。此外,当 response.status 不为 200 时,OP 没有返回任何内容,这也是一个问题。 - jfriend00
谢谢@jfriend00,我现在明白了。当状态码不是200时,你建议做什么?我对异步编程还比较新。 - Fateh AK
我不知道当状态码不是200时,OP想要什么。我在他们的问题下发表了评论来询问他们。可能如果不是4xx或5xx,他们想要拒绝,但如果是2xx或3xx,他们可能想要针对状态码执行特定操作。 - jfriend00
@jfriend00 我明白你的意思,但 OP 要求提供替代方案,我只是建议了这个。至于混合的问题,我是指他们正在使用的语法方面更多的东西。我也同意 Johnathan 的观点,再次抛出它没有任何意义。但这不是 OP 请求的内容。 - psychnaut
2
这里最好的答案不会推荐贫乏或无用的代码,而这正是catchthrow err所在的位置,无论OP要求什么。这就是我的评论的重点。我没有给你投反对票。我指出了一种你的答案可以改进的方式,并希望其他阅读此答案并希望OP知道这里的catch是多余的人知道。你可以进一步改进你的答案。 - jfriend00
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接