const PENDING='pending'
const FULFILLED='fulfilled'
const REJECTED='rejected'
class MyPromise{
/**
* 创建一个Promise
* 1.任务执行出错,promise自动设置为rejected
* @param {Function} executor 任务执行器 立即执行
*/
constructor(executor){
this._state=PENDING
this._value=undefined
try{
executor(this._resolve.bind(this),this._reject.bind(this))
}
catch(err){
this._reject(err)
}
}
/**
* 成功状态和数据
* @param {any} data
*/
_resolve(data){
this._changeState(FULFILLED,data)
}
/**
* 失败状态和数据
* @param {any} reason
*/
_reject(reason){
this._changeState(REJECTED,reason)
}
/**
* 处理状态和数据:
* 1.状态更改一次后禁止更改
* @param {String} newState
* @param {any} value
*/
_changeState(newState,value){
if(this._state!==PENDING){
return;
}
this._state=newState
this._value=value
}
}
const p=new MyPromise((resolve,reject)=>{
resolve(2)
})
错误记录
TypeError: Cannot set properties of undefined (setting '_state')
resolve()被直接调用,this指向window,而不是实例---->.bind(this)
优化点:
常用的字符串转化成常量
重复的功能抽象成函数 _changeState