手写一个Promise

73 阅读1分钟
function Promise(executor) {
    let self = this
    // status 最终只有一个状态 pending->resolved 或 pending->rejected
    self.status = 'pending'
    self.value = undefined
    self.reason = undefined
    //存放then 里的函数
    self.resolveFns = []
    self.rejectFns = []
    function resolve(v) {
        if (self.status === 'pending') {
            self.status = 'resolved'
            self.value = v
            self.resolveFns.forEach(fn=>fn())
        }
    }

    function reject(v) {
        if (self.status === 'pending') {
            self.status = 'rejected'
            self.reason = v
            self.rejectFns.forEach(fn=>fn())
        }
    }
    executor(resolve, reject)
}
Promise.prototype.then = function(resolveCall, rejectCall){
    let self = this
    if (this.status === 'resolved') {
        resolveCall(this.value)
    }
    if (this.status === 'rejected') {
        rejectCall(this.reason)
    }
    if(this.status ==='pending'){
        //当执行then 时,如果值是 pending 就把 回调函数放入对象对应的状态库里
        console.log('then pending')
        this.resolveFns.push(function(){
            resolveCall(self.value)
        })
        this.rejectFns.push(function(){
            rejectCall(self.reason)
        })
    }
}
var promise = new Promise((resolve, reject) => {
    setTimeout(function(){ // 验证异步调用
        resolve('ok')
        reject('err') // 验证 then里的 resolveCall,rejectCall只成功一个
    },0)
})
promise.then((value) => {
    console.log('value',value)
}, (err) => {
    console.log('err',err)
})