手写系列——Promise

177 阅读2分钟

本文纯手写,且通过Promises/A+测试,有兴趣的童鞋可以自己本地跑一下试试

一、确定需求

就是平时会怎么用Promise呢?

new Promise((resolve, reject) => {})
promise.then(result => {})
Promise.all([])
Promise.rece([])
Promise.resolve(value)
Promise.reject(error)

大概就这些吧,传参明确,需求清晰

二、实现构造函数

Promise是一个类,那就整个class,顺便写一下构造函数

构造函数里,维护当前实例的状态,正确取值和错误取值, 收集各种回调,并且要将之后实现的resolve和reject传进参数的函数当中。简单写下,不够后面再加

三、实现resolve

resolve本身也是一个函数,接收一个参数。

重点就在,这个参数可能是各种类型的,所以这里做了区分处理:
是实例自身、有then方法的但不是Promise实例、是Promise实例、是普通的值

四、实现reject

reject 其实也可以像上面那么区别判断一下,不过简单实现之后,测试过了,那就先写个1.0,后面有需求再说

五、实现then

then接收2个回调参数,返回Promise。根据当前不同的状态,保存或者直接执行注入的回调

到这,基本就能简单的用用了。或许会有人问,看别人写的,都判断了then中传参的方法(onFulfilled) 返回值是Promise的情况,你这么写能行吗。显然,很可以。在resolve中这个情况已经预测到了,会将新返回的Promise中的onFulfilledArr函数进行覆盖或者执行,进入下一个实例的异步。

六、实现all

就是按原数组的顺序返回,而不是返回的时间顺序,且要求所有异步都返回时才返回。面试常考

七、实现rece

这个就比较简单了,有一个异步返回的话,就可以resolve了

八、allSettled,finally,any待实现……

其他

如果想跑测试用例的话,要加一些其他的函数

详细参考git仓库