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的实现的主要内容,如果未能解决你的问题,请参考以下文章