实现Promise
参阅这个,层层递进,写得非常好:https://zhuanlan.zhihu.com/p/58428287
极简内核
Promise可以new, 所以它是一个类
new Promise 传入一个函数,所以constructor是fn
fn中会有resolve,我们需要自己定义_resolve传进去作为方法,因此有fn(this._resolve.bind(this))
new Promise的实例还可以.then,因此then是Promise的方法
内部维护一个callback,作为传入fn的管理,在调用resolve的时候全部遍历执行
class Promise {
callbacks = [];
constructor(fn) {
// 内部的_resolve绑定为外部调用
fn(this._resolve.bind(this))
}
then(onFulfilled){
this.callbacks.push(onFulfilled)
}
_resolve(value){
this.callbacks.forEach(fn => fn(value))
}
}链式调用
由于promise可以组成then的链式调用,then方法必然也返回promise的实例
promise.then是微任务,并不是立即执行,需要增加state作为状态进行执行或者收集的判断
promise.then可以传递值给下一个then,因此需要内部维护结果,增加value值
promise.then 的 onFulfilled 可以为空,直接resolve之前的值,否知先收集,再统一执行
错误处理
增加reject
onRejected也可以为空
即使是有rejected,那也只是设置状态,之前的callback依然要遍历执行完
catch
catch也是接收一个函数
catch会挂载一个onError, 然后注册到then作为下一个微任务执行
为什么class是一个callbacks数组。这里就是callback数组会有两个callback了。一个是then注册的,一个是catch注册的。其他的then都是注册一个新的实例
实现静态方法
Promise.resolve对于一个promise实例,会直接返回该实例,因为它自身就有then方法
Promise.resolve对于一个对象属性then为函数的,会创建新Promise实例,把这个函数then 传入resolve
Promise.resolve对于一个值(即使是函数),会创建新Promise实例,并resolve这个值
实现finally
finally 不管是onFulfilled 还是 onRejected 都会被调用,因为内部注册到then 上要挂载 两个函数
最后更新于
这有帮助吗?