Promise实现

Promise实现:最难的部分感觉是不同实现的Promise之间的交互,代码看不懂,暂时不加那部分的代码
function Promise (executor){
  var self = this
  self.status = 'pending'
  self.data = null
  self.onResolvedCallBack = []
  self.onRejectedCallBack = []
  function reslove(value){
    if(self.status === 'pending'){
      self.status = 'fulfilled'
      self.data = value
      self.onResolvedCallBack.forEach(cb => cb(value))
    }
  }
  function reject(reason){
    if(self.status === 'pending'){
      self.status = 'rejected'
      self.data = reason
      self.onRejectedCallBack.forEach(cb => cb(reason))
    }
  }
  try{
    executor(reslove,reject)
  }catch(e){
    reject(e)
  }
}

Promise.prototype.then = (onResolved,onRejected) => {
  let self = this
  let promise2
  onResolved = typeof onResolved === 'function' ? onResolved : value => { return value }
  onRejected = typeof onRejected === 'function' ? onRejected : reason => { throw reason }
  if(self.status === 'fulfilled'){
    return promise2 = new Promise((reslove,reject) => {
      try{
        var x = onResolved(self.data)
        if(x instanceof Promise){
          x.then(reslove,reject)
        }else{
          reslove(x)
        }
      }catch(e){
        reject(e)
      }
    })
  }
  if(self.status === 'rejected'){
    return promise2 = new Promise((reslove,reject) => {
      try{
        var x = onRejected(self.data)
        if(x instanceof Promise){
          x.then(reslove,reject)
        }else{
          reslove(x)
        }
      }catch(e){
        reject(e)
      }
    })
  }
  if(self.status === 'pending'){
    return promise2 = new Promise((reslove,reject) => {
      self.onResolvedCallBack.push(function(value){
        try{
          var x = onResolved(value)
          if(x instanceof Promise){
            x.then(reslove,reject)
          }else{
            reslove(x)
          }
        }catch(e){
          reject(e)
        }
      })
      self.onRejectedCallBack.push(reason => {
        try{
          var x = onRejected(reason)
          if(x instanceof Promise){
            x.then(reslove,reject)
          }else{
            reslove(x)
          }
        }catch(e){
          reject(e)
        }
      })
    })
  }
}

Promise.prototype.catch = onRejected => {
  return this.then(null,onRejected)
}

/**
* 不同之间的Promise之间交互目前实在是看不太懂,暂时不加上那部分代码
*/
Promise.resolve = value => {
  return new Promise((resolve,reject) => {resolve(value)})
}

Promise.reject = reason => {
  return new Promise((reslove,reject) => {reject(reason)})
}

Promise.all = promises => {
  return new Promise((reslove,reject) => {
    let values = []
    let count = 0
    promises.forEach((promise,index,promises)=>{
      promise.then(value=>{
        values[index] = value
        count++
        if(count === promises.length){
          resolve(values)
        }
      },reject)
    })
  })
}

Promise.race = promises => {
  return new Promise((reslove,reject)=>{
    promises.forEach(promise=>{
      promise.then(reslove,reject)
    })
  })
}

Promise.allSettled = promises => {
    return new Promise((resolve) => {
        let values = []
        let count = 0
        promises.forEach((promise,index,promises)=>{
            promise.then(value=>{
                values[index] = value
           }).catch((error)=>{
                values[index] = error
            }).finally(()=>{
                ++count
                if(count == promises.length){
                    resolve(values)
                }
            })
        })
    })
}

Promise.any = promises => {
    return new Promise((resolve,reject) => {
        let count = 0
        let arr = []
        promises.forEach(promise => {
            promise.then(res => {
                resolve(res)
            }).catch(err => {
                ++count
                arr.push(err)
                if(count == promises.length){
                    reject(arr)
                }
            })
        })
    })
}

  

   

原文地址:https://www.cnblogs.com/zhenjianyu/p/12965051.html