首页 > 解决方案 > 如果使用较短的语法,则 Promise(axios 请求)在 catch 块中记录为待处理

问题描述

不幸的是,我似乎找不到一个看似简单的初学者问题的答案(尝试学习一些 Javascript)。

我在示例反应应用程序中运行此代码(本地主机上的此路径不存在):

const promise2 = axios.get('http://localhost:3001/foobar').then(response => {
   // do nothing
}).catch((err) => {
   console.log(promise2)
})

这将登录Promise { <state>: "pending" }Firefox 开发者版 (76.0b5)

如果我将代码更改为

const promise2 = axios.get('http://localhost:3001/foobar')
promise2.then(response => {
   // do nothing
}).catch((err) => {
   console.log(promise2)
})

这记录Promise { <state>: "rejected" }了我认为在这两种情况下都应该记录的内容。

为什么?

标签: javascriptpromiseaxios

解决方案


在您的第一个示例中,promise2调用的结果是:

const promise2 = axios.get(...).then(...).catch(...)

而且,它是一个新的承诺,与返回的内容不同,它在or处理程序运行axios.get()之后才被解析,因为它的解析值或被拒绝的原因是由or处理程序中发生的事情决定的。.catch().then().then().catch()

链中的每一步都返回一个新的 Promise,直到它在链中的每一步都被解决并且直到这个特定的处理程序被执行(或被绕过)之前才会被解决。

所以,在这个链中:

const promise2 = axios.get(...).then(...).catch(...)

您从 获得第一个承诺axios.get(),然后从 获得另一个承诺,然后从 获得.then()另一个承诺,.catch()并将promise2包含来自 的最后一个承诺.catch()。在整个链完成之前,最终的承诺不会解决或拒绝。


在您的第二个示例中,promise2只是调用的结果:

const promise2 = axios.get()

因此,promise2一旦axios()调用完成,该值就会被知道,并且会在.then()or.catch()处理程序被调用时知道:

promise2.then().catch()

PS如果有人能指出我(在评论中)这些方法返回新对象的理由以及我可以用这些新对象做什么,我将不胜感激。

它与承诺链的工作方式有关。为了实现多个.then()处理程序的链接,其中每个处理程序本身都可以包含返回新承诺的函数,您需要在链中创建中间承诺,这些承诺依赖于链中稍后发生的事情。

以下是其他一些相关的答案:

了解 javascript 承诺;堆栈和链接

javascript承诺中的执行顺序是什么

promise.then.then 和 promise.then 之间有区别吗?承诺.then

您通常不会自己对中间 Promise 对象做任何事情,它们主要是为了使 Promise 链接正常工作。你通常会这样做:

axios.get(...).then(...).catch(...)

并且不将任何承诺分配给任何变量。


推荐阅读