手写Promise

29 阅读1分钟

const PENDING = 'pending';
const FULFILLED = 'fulfilled';
const REJECT = 'reject';

class MyPromise {
    /**
     * 创建一个Promise
     * @param {Function} executor 任务执行器,立即执行
     */
    constructor(executor){
        this._state = PENDING;//状态
        this._value = undefined;//数据
        try{
            executor(this._resolve.bind(this),this._reject.bind(this))
        } catch (error){
            this._reject(error)
        }
        
    }
    /**
     * 更改任务状态
     * @param {String} newState 新状态
     * @param {any} value 数据
     * @returns 
     */
    _changeState = (newState,value)=>{
        if(this._state !== PENDING){
            // 目前状态已经更改完成,不可再次修改状态
            return
        }
        this._state = newState;
        this._value = value;
    }
    /**
     * 标记当前任务完成
     * @param {any} data 任务完成得相关数据
     */
    _resolve = (data)=>{
        this._changeState(FULFILLED,data);
    }
    /**
     * 标记当前任务失败
     * @param {any} season 任务失败得相关数据
     */
    _reject = (season)=>{
        this._changeState(REJECT,season);
    }
}

new MyPromise((resolve,reject)=>{
    resolve('123');
    // resolve('321');
    // throw new Error('错误')
})