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

如题所述

第1个回答  2022-07-26

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()链式调用参考

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网