手写Promise-实现状态的变化

42 阅读1分钟
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