Promise的实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Promise的实现相关的知识,希望对你有一定的参考价值。

参考技术A 我们都知道promise 有三种状态

并且promise 的状态是不可逆的

每一个 Promise 都有两个 函数参数,分别是

通过查看 Promise 我们可以发现 resolve,reject,all,race是静态方法,then,catch,finally是实例方法。

通过以上的分析,我们 Promise 基本结构已经明朗了

我们 new 一个promise的时候都是直接执行,这个执行的函数就是 executor。而他有两个函数参数,分别是resolve,reject。而又因为我们状态是不可逆的,所以只能是在PENDING 状态下执行。

对于promise 而言,throw也应该被监听到(reject),所以我们需要在执行 executor的时候,加一个 try catch。

所以我们将constructor 里面的代码做了如下的改变

then方法会接收两个方法,onfulfilled, onrejected。而当status状态被改变后,onfulfilled, onrejected才应该被执行。同时onfulfilled,onrejected 是 可选参数

这个时候我们的promise已经完成了一班。我们可以执行promise函数,可以调用他的then方法,并且在then中也可以拿到他的值。非常完美。

但是这远远不够,接下来就让我们思考一下then的特性,让我们一起完善他!!!

也就是说,异步情况下,执行then的时候,状态依旧是pending,

同时,promise会有如下的调用情况

异步时间到了之后,我们就需呀继续这个数组(发布)

为了达成链式,我们需要在then里返回一个promise。类似于递归。

同时呢,我们的then还有这样一个特性。遇到非promise类型的时候是直接resolve返回的,遇到promise类型的,会进行判断。因为我们的then的四个运行地方都会用到这个函数。我们将其提取出来。

这一块的代码是按照 Promise/A+ (https://promisesaplus.com/z)规范写的。也就不需要仔细说了

这个时候then函数变成了如下的状态

聪明的你肯定发现了promise2本生就是一个异步的,我们调用resolvePromise(promise2,x,resolve,reject) 时,promise2为空。那么我们也将其变成异步即可。同时为了防止这一步有错,加一个try catch

我们的resolve,reject会将传入的值,返回一个新的promise

但是如果传入的值本身就是promise类型的,那么直接返回即可。

all()

所有的传入一个数组,每个都正常返回,即返回resolve,反之reject。同时因为数组中存在异步执行的情况,我们需要写一个promiseAdd函数来计算当前promise完成进度。

race()

只要有一个实例率先改变状态,新的MyPromise的状态就跟着改变

catch就相当于调用了then方法,走的是onrejected状态

无论成功还是失败,均会执行。同时 finally() 并不是结束,他依旧可以返回一个promise

以上是关于Promise的实现的主要内容,如果未能解决你的问题,请参考以下文章

promise怎么实现异步

Promise原理及实现

Promise原理及实现

怎么用promise实现异步控制

promise底层实现

promise底层实现