首页 > 其他分享 >照猫画虎之实现Promise

照猫画虎之实现Promise

时间:2022-09-26 19:24:20浏览次数:49  
标签:status 实现 照猫画虎 rev value Promise failedCb pending UglyPromise

 

// promise(丑陋的)
class UglyPromise {
  constructor(callback){
    this.status = 'pending'
    this.value = undefined
    this.sucessCb = []
    this.failedCb = []
   
    const resolve = value => {
      if(this.status === 'pending'){
        this.status = 'success'
        this.value = value
        this.sucessCb.forEach(fn => {
          fn(value)
        })
      }
    }
    
    const reject = value => {
      if(this.status === 'pending'){
        this.status = 'failed'
        this.value = value
        this.failedCb.forEach(fn => {
          fn(value)
        })
      }
    }
   
    try {
      callback(resolve, reject)
    } catch(e) {
      reject(e)
    }
  }
 
  then(successCb, failedCb){
    
    if(typeof successCb === 'function'){
      if(this.status == 'pending'){
        this.sucessCb.push(successCb)
      }else{
        successCb(this.value)
      }
    }
    if(typeof failedCb === 'function'){
      
      if(this.status == 'pending'){
        this.failedCb.push(failedCb)
      }else{
        failedCb(this.value)
      }
    }
    
    return this
  }
  
  catch(failedCb){
    if(typeof failedCb === 'function'){
      if(this.status == 'pending'){
        this.failedCb.push(failedCb)
      }else{
        failedCb(this.value)
      }
    }
  }
  
}

UglyPromise.resolve = value =>{
    return new UglyPromise(rev => {
      rev(value)
    })
}

UglyPromise.race = arr =>{
    return new MyPromise((rev,rej) => {
      for(let i = 0;i < arr.length;i++){
        arr[i].then(res => {
          rev(res)
        }).catch(e => {
          rej(e)
        })
      }
    })
}

UglyPromise.all = arr =>{
    let length = arr.length;
    let count = 0;
    let result = new Array(length);
    if(length == 0){
        return UglyPromise.resolve()
    }
    return new UglyPromise((rev,rej) => {
      for(let i = 0;i<arr.length;i++){
        arr[i].then(res => {
          result[i] = res // 为了结果顺序与开始顺序一致
          if(++count == length){
            rev(result)
          }
        }).catch(e => {
          rej(e)
        })
      }
    })
}

  

标签:status,实现,照猫画虎,rev,value,Promise,failedCb,pending,UglyPromise
From: https://www.cnblogs.com/shaoyunfeng93/p/16732059.html

相关文章