手写promise核心代码

57 阅读1分钟
class Commitment{
    static PENDING = '待定';static FULFILLED = '成功';static REJECTED = '拒绝';
    constructor(func){
        this.status = Commitment.PENDING;
        this.result = null;
        this.resolveCallback = []
        this.rejectCallback = []
        try {
            func(this.resolve.bind(this),this.reject.bind(this))
        } catch (error) {
            this.reject(error)
        }
    }
    resolve(result){
        setTimeout(()=>{
            if(this.status === Commitment.PENDING){
                this.status = Commitment.FULFILLED;
                this.result = result
                this.resolveCallback.forEach(callback=>{
                    callback(result)
                })
            }
        })
    }
    reject(result){
        setTimeout(()=>{
            if(this.status === Commitment.PENDING){
                this.status = Commitment.REJECTED;
                this.result = result
                this.rejectCallback.forEach(callback=>{
                    callback(result)
                })
            }
        })
    }
    then(onFULFILLED,onREJECTED){
        onFULFILLED = typeof onFULFILLED === 'function' ? onFULFILLED:()=>{}
        onREJECTED = typeof onREJECTED === 'function' ? onREJECTED:()=>{}
        if(this.status === Commitment.PENDING){
            this.resolveCallback.push(onFULFILLED)
            this.rejectCallback.push(onREJECTED)
        }
        if(this.status === Commitment.FULFILLED){
            setTimeout(()=>{
                onFULFILLED(this.result)
            })
        }
        if(this.status === Commitment.REJECTED){
            setTimeout(()=>{               
                onREJECTED(this.result)
            })
        }
    }
}
console.log('1');
let commitment = new Commitment((resolve,reject)=>{
    console.log('2');
    setTimeout(()=>{
        resolve('yes')
        reject('no')
        console.log(4);
    })
})
commitment.then(
    result=>{console.log(result);},
    result=>{console.log(result.message);}
)
console.log(3);