javascript - 如果使用较短的语法,则 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" }
了我认为在这两种情况下都应该记录的内容。
为什么?
解决方案
在您的第一个示例中,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()
处理程序的链接,其中每个处理程序本身都可以包含返回新承诺的函数,您需要在链中创建中间承诺,这些承诺依赖于链中稍后发生的事情。
以下是其他一些相关的答案:
promise.then.then 和 promise.then 之间有区别吗?承诺.then
您通常不会自己对中间 Promise 对象做任何事情,它们主要是为了使 Promise 链接正常工作。你通常会这样做:
axios.get(...).then(...).catch(...)
并且不将任何承诺分配给任何变量。
推荐阅读
- sql-server - 单个行上的 WHERE 子句
- flutter - Flutter 图像选择器 Web
- php - 如何使用 Laravel 集成 CCAvenue
- c# - 从多个内部元素 od XML 文件中获取名称属性值到 C#
- vbscript - 验证 vbScript 参数名称
- python - 使用 Biopython 时:NameError: name 'pubmed_id' is not defined 即使之前已经定义过?
- python - 套接字编程:客户端在向服务器发送 3 条消息后停止响应
- android - 获取改造异步调用的结果
- php - 数据库中有两个不同的表我想按日期或时间顺序从一个表中获取数据?
- javascript - Canvas 圆弧函数的含义