自建promise
2019-03-15 本文已影响0人
Cc极生
基本原理
1.通过构造方法生成一个promise对象,但是构造方法中传入的方法不会立即调用
2.通过then给promise对象中的成功方法列表中添加方法,通过catch给promise中的失败方法列表添加方法
3.初始状态为pending,且变为fulfilled或rejected后不会再被改变
4.在添加完所有方法后执行构造函数中添加的方法,仅有构造函数中传入的方法可以修改promise的执行状态,后续then中添加的方法不会有resolve,reject的传参
class PromiseA {
constructor(asyncFunc) {
this.handlerList = []
this.catchList = []
this.state = 'pending'
setTimeout(() => {
asyncFunc(this.resolve.bind(this),this.reject.bind(this))
});
return this
}
resolve() {
if (this.state !== 'pending') { // 保证promise状态在改变后不会再被修改
return
}
this.state = 'fulfilled'
this.handlerList.forEach(element => { // 依次运行所有注册在成功调用方法列表中的方法
element()
});
}
reject(err) {
if (this.state !== 'pending') { // 保证promise状态在改变后不会再被修改
return
}
this.state = 'rejected'
this.catchList.forEach(element => { // 依次运行所有注册在错误捕获方法列表中的方法
element(err)
})
}
then(asyncFunc) {
this.handlerList.push(asyncFunc)
return this
}
catch(errFunc) {
this.catchList.push(errFunc)
}
}
new PromiseA((resolve, reject) => {
setTimeout(() => resolve(), 3000)
// reject('123')
reject()
})