简单实现Promise

// 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)
        })
      }
    })
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容