【算法 笔记2】Promise 实现

/**
 * then onResolved成功回调函数,onRejected失败回调函数
 */

const PENDING = 'pending',REJECTED = 'rejected',FULFILLED='fulfilled'
function MyPromise(executor){
    let self = this
    self.status = PENDING
    self.value = undefined
    self.onResolvedCallback = []
    self.onRejectedCallback = []
    function resolve(value){
        setTimeout(()=>{
            if(self.status === PENDING){
                self.status = FULFILLED
                self.value = value
                for(let i = 0; i < self.onResolvedCallback.length; i++) {
                    self.onResolvedCallback[i](value)
                }
            }
        },0)
    }
   function reject(reason){
        setTimeout(()=>{
            if(self.status === PENDING){
                self.status = REJECTED
                self.value = reason
                for(let i = 0; i < self.onRejectedCallback.length; i++) {
                    self.onRejectedCallback[i](reason)
                }
            }
        },0)
    }
    try {
        executor(resolve,reject)
    }catch(e){
        reject(e)
    }
}
MyPromise.prototype.then = function(onResolved,onRejected){
    let self = this
    onResolved = typeof onResolved === 'function' ? onResolved : function(v) {return v}
    onRejected = typeof onRejected === 'function' ? onRejected : function(r) {throw r}
    if(self.status === FULFILLED) {
        return new MyPromise((resolve,reject)=>{
            try{
                let x = onResolved(self.value)
                if(x instanceof MyPromise) {
                    x.then(resolve, reject)
                }else{
                    resolve(x)
                }
            }catch(e){
                reject(e) 
            }
        })
    }
    if(self.status === REJECTED) {
        return new MyPromise((resolve,reject)=>{
            try{
                let x = onRejected(self.value)
                if(x instanceof MyPromise) {
                    x.then(resolve, reject)
                }else {
                    reject(x)
                }
            }catch(e){
                reject(e) 
            }
        })
    }
    if(self.status === PENDING) {
        return new MyPromise((resolve,reject)=>{
            self.onResolvedCallback.push(()=> {
                try {
                  let x = onResolved(self.value)
                  if (x instanceof MyPromise) {
                    x.then(resolve, reject)
                  }else {
                    resolve(x)
                  }
                } catch (e) {
                  reject(e)
                }
            })
            self.onRejectedCallback.push(()=> {
                try {
                  let x = onRejected(self.value)
                  if (x instanceof MyPromise) {
                    x.then(resolve, reject)
                  }else {
                    reject(x)
                  }
                } catch (e) {
                  reject(e)
                }
            })
        })
    }
}
MyPromise.prototype.catch = function(onRejected) {
    return this.then(null, onRejected)
}
MyPromise.all = function(args) {
    return new MyPromise((resolve,reject)=>{
        let values = [],count = args.length
        while(args.length > 0) {
            args.shift()
            .then((v)=>{
                count --
                values.push(v)
                if(count === 0) resolve(values)
            })
            .catch((e)=>{reject(e)})
        }
    })
}
MyPromise.resolve = function(v) {
    return new MyPromise((resolve,reject)=>{resolve(v)})
}
MyPromise.reject = function(v) {
    return new MyPromise((resolve,reject)=>{reject(v)})
}
let promise1 = new MyPromise((resolve,reject)=>{
    setTimeout(()=>{
        resolve(1)
    },100)
}).then((v)=>{
   console.log('----v----',v)
   return MyPromise.resolve(v)
}).then(v2=>{
    console.log('----v2----',v2) 
    return MyPromise.reject(v2)
}).catch(e=>console.log(e))
let promise2 = new MyPromise((resolve,reject)=>{
    setTimeout(()=>{
        resolve(2)
    },100)
})
let promise3 = new MyPromise((resolve,reject)=>{
    setTimeout(()=>{
        resolve(3)
    },100)
})
let promise4 = new MyPromise((resolve,reject)=>{
    setTimeout(()=>{
        resolve(4)
    },100)
})
MyPromise.all([promise2,promise3,promise4]).then((v)=>{
    console.log(v)
})
.catch(e=>{console.log(e)})

猜你喜欢

转载自www.cnblogs.com/seny-33/p/12945068.html