问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

帮你弄懂Promise原型方法then、catch、finally

发布网友 发布时间:2022-10-15 02:33

我来回答

1个回答

热心网友 时间:2024-11-09 22:59

PS: 最近一周加班太多,没有太多空闲时间读书,暂时先这一篇吧!

Promise 构造函数的原型上实现了 then , catch , finally 方法,也就意味着每个 Promise 实例都拥有这样 3 个函数。

另外提一下 Promise 构造函数上实现了 all , race , reject , resolve , allSettled , any 方法,==这些方法只属于 Promise 构造函数自己,是不能在实例中被调用的==(也就是只会以这种形式出现:如 Promise.all() )

then() 方法可以处理 Promise 被接受或拒绝的情况。

then() 最多可以接受两个参数 (回调函数):

① onFulfilled

当 Promise 变成接受状态 ( fulfilled ) 时调用的函数。该函数有一个参数,即接受的最终结果 (the fulfillment value)。

如果该参数 (指的是 onFulfilled ) 不是函数,则会在内部被替换为 (x) => x ,即原样返回 promise 最终结果 (后面会讨论 then 方法的返回值)。

注意:这里说的参数不是函数也 ==包括没有参数== 的情况!下图说明了这 3 钟情况:

② onRejected

1)当 Promise 变成拒绝状态 ( rejected ) 时调用的函数。该函数有一个参数,即拒绝的原因 (rejection reason)。

2)如果该参数 (指的是 onRejected ) 不是函数,则会在内部被替换为一个 "Thrower" 函数 (it throws an error it received as argument),也就是会报错。

注意:同理,这里说的参数不是函数也 包括没有参数 的情况:

当 Promise 完成 (fulfilled) 或者失败 (rejected) 时,会异步调用返回函数,==返回一个 Promise 对象==,不过返回值与 then() 方法中的回调函数是有关系的,如果then() 的回调函数:

没有返回任何值。那么 then 返回一个接受状态的 Promise ,并且该接受状态回调函数的参数值为 undefined 。

也就是说在处理 then() 返回的 Promise 的回调函数中参数是 undefined ,不理解就看下面的例子:

下面的例子可能对你理解第二句话有帮助 (后面的几种情况都与此类似,都举例说明了):

返回一个值。那么 then 返回一个接受状态的 Promise ,并且将返回的值作为接受状态的回调函数的参数值。

与 ① 情况类似,只是返回的 undefined 变成值

抛出一个错误。那么 then 返回一个拒绝状态的 Promise ,并且将抛出的错误作为拒绝状态的回调函数的参数值

后面三种是分别返回不同状态的 Promise

返回一个接受状态的 Promise 。那么 then 也会返回一个接受状态的 Promise ,并且将那个 Promise 的接受状态的回调函数的参数值作为该被返回的 Promise 的接受状态回调函数的参数值

返回一个拒绝状态的 Promise 。那么 then 也会返回一个拒绝状态的 Promise ,并且将那个 Promise 的拒绝状态的回调函数的参数值作为该被返回的Promise的拒绝状态回调函数的参数值

返回一个未定状态 ( pending ) 的 Promise 。那么 then 返回 Promise 的状态也是未定的,并且它的终态与那个 Promise 的终态相同;同时,它变为终态时调用的回调函数参数与那个 Promise 变为终态时的回调函数的参数是相同的

示例中延时返回以得到 pending 状态的 Promise ,立即查看就得到还未有返回值的 pending 状态,2秒钟之后就能看到有返回值的终态

也可以试着用 then() 方法捕捉一下参数:

catch() 方法用来处理 Promise 被拒绝的情况,相当于 then(undefined, onRejected)

catch() 接受一个参数 (回调函数):

① onRejected

1)当 Promise 被 rejected 时调用的函数。 该函数拥有一个参数 reason ( rejection 的原因)

2)如果这个参数 (指的是 onRejected ) 不是函数时,也是会报错的。这与 then() 方法中第二个参数不是函数的情况吻合。

如果 catch() 中的回调函数 抛出一个错误 或返回一个本身失败的 Promise , 则返回一个 rejected 状态的 Promise ;其他情况返回 resolved 状态的 Promise

catch()链式调用参考

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
求这图片原图或者主角 出自哪一边电影或者电视剧 哪位大神知道这张图原版在吗?求原版。。。 在word中加下划线时第一次出现一条下划线第二次怎么就出现两条... 诛仙2资料站里的宠物展示能在npc买到吗 求一些诛仙2中的可以变为人形的宠物名字 诛仙2 神域的神农殿里,这是什么东西 诛仙2宠物元神问题 诛仙2 商城 中 宠物元神 怎么比 宠物 还贵啊?宠物元神是干什么的啊... 电热水器怎么安固定花洒 猛鬼夜惊魂剧情介绍 关于CFA报名的问题谢谢 Pending for Fulfillment 翻译成中文是什么意思? 几何体分类 初中英语语法总结。越精炼越好。 木梨硔一一山脊上的村庄 炖兔肉可以放菠菜吗? 兔子肉能和菠菜一起吃吗 兔肉能与菠菜一起吃吗 兔肉能与菠菜一起吃吗? 为什么淘宝页面显示的销量与实际不符呢? 淘宝商品销售数量显示和实际不符 在淘宝上卖东西销量和实际销量不符怎么回事 汤姆猫跑酷和地铁跑酷谁是正版 三国贾诩和贾逵有什么关系吗? 古代的“浸猪笼”却发生在文明时代的今天,大家怎么看? 在古代,为什么不检点的男女都要被浸猪笼? 导演张纪中简历 张纪中是什么人 接近开关输出是正还是负 两根线的36伏接近开关输出短路会怎样? 抚恤金计算方法 EXCEL怎么使用地址引用啊? 翻译 紧急急急急 明明白白选专业:中国大学专业排名及专业介绍 波音773和空客380哪个更好 773飞机型怎么样 自驾游从北京出发承德到北戴河4天三夜,谁能推荐一下怎么玩 南极冰层下发现91座火山? 我想问问小米手机如何恢复出厂设置方法 第一个登上艾埃里伯斯火山的人是谁 埃里伯斯火山的发现历史 Erebus是什么山 保时捷现在的一般价格是多少? 外观大气、动感,动力强劲,最便宜的保时捷SUV要多少钱? 什么是带通滤波器及其中心频率 带通滤波器及其中心频率是什么_百度知 ... 许继电气股票怎么买入?许继电气股票后市如何?许继电气分红利好还是利 ... 科泰电源股怎么买,300153股怎么买 例:小雨沙沙。河水--- 商务礼仪与职场礼仪 国际贸易中的商务礼仪 南红玛瑙手串一般能卖多少钱一克