实现Promise

参阅这个,层层递进,写得非常好:https://zhuanlan.zhihu.com/p/58428287

极简内核

  1. Promise可以new, 所以它是一个类

  2. new Promise 传入一个函数,所以constructor是fn

  3. fn中会有resolve,我们需要自己定义_resolve传进去作为方法,因此有fn(this._resolve.bind(this))

  4. new Promise的实例还可以.then,因此then是Promise的方法

  5. 内部维护一个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))
	}
}

链式调用

  1. 由于promise可以组成then的链式调用,then方法必然也返回promise的实例

  2. promise.then是微任务,并不是立即执行,需要增加state作为状态进行执行或者收集的判断

  3. promise.then可以传递值给下一个then,因此需要内部维护结果,增加value值

  4. promise.then 的 onFulfilled 可以为空,直接resolve之前的值,否知先收集,再统一执行

错误处理

  1. 增加reject

  2. onRejected也可以为空

  3. 即使是有rejected,那也只是设置状态,之前的callback依然要遍历执行完

catch

  1. catch也是接收一个函数

  2. catch会挂载一个onError, 然后注册到then作为下一个微任务执行

  3. 为什么class是一个callbacks数组。这里就是callback数组会有两个callback了。一个是then注册的,一个是catch注册的。其他的then都是注册一个新的实例

实现静态方法

  1. Promise.resolve对于一个promise实例,会直接返回该实例,因为它自身就有then方法

  2. Promise.resolve对于一个对象属性then为函数的,会创建新Promise实例,把这个函数then 传入resolve

  3. Promise.resolve对于一个值(即使是函数),会创建新Promise实例,并resolve这个值

thenable函数为:A = { then : function(onFulfilled, onRejected){...}}

实现finally

  1. finally 不管是onFulfilled 还是 onRejected 都会被调用,因为内部注册到then 上要挂载 两个函数

最后更新于

这有帮助吗?