一、整体分析
所谓
Promise
就是一个容器,有三个状态:PENDING(进行中)、FULFILLED(成功)、REJECTED(失败),里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果,有两大特点:
- 容器状态不受外界影响
- 一旦状态改变就不会再变,任何时候都可以得到这个结果
来看下Promise的用法:
1 | new Promise((resolve, reject) => { |
通过用法不难分析出:
Promise
构造函数接受一个函数参数exector
,exector
接受resolve
和reject
两个函数并立即执行,通过resolve/reject
改变状态.- 状态改变后,触发原型链上的
then catch
方法. - Promise类拥有静态方法
resolve、reject、all、race
.
那么可以写出大致结构代码:
1 | class Promise { |
之后在此基础上补充代码.
二、实现初版
首先引入三种状态,完善resolve、reject
函数,最后在构造函数内执行exector(resolve, reject)
:
1 | //定义三种状态 |
注意:exector(resolve, reject)
;执行可能会报错,所以需要使用try包括一下
, 有报错reject
抛出去.
1 | class Promise { |
此时可以使用then
进行捕获了,then
接收两个参数,分别对应FULFILLED
和REJECTED
状态:
1 | new Promise().then( |
注意:then、catch
是微任务,这里使用setTimeout
模拟:
1 | then(onFulfilled, onRejected) { |
Ok,出版已经完成:
1 | //定义三种状态 |
可以拿数据测试一下:
1 | const promise = new Promise((resolve, reject) => { |
作者:洛霞
链接:https://juejin.im/post/6860037916622913550
来源:掘金