手寫一個promise

// 聲明三種狀態機
const STATUS = {
  PENDING: 0,
  FULFILLED: 1,
  REJECTED: 2
}

function Promise(exector){
  this.status = STATUS.PEDNDING
  // resolve返回的數據
  this.resolveData = null
  // reject返回的數據
  this.rejectData = null
  // 緩存成功回調的函數
  this.onFulfilledList = []
  // 緩存失敗回調的函數
  this.onRejectedList = []
  let self = this;
  // 成功時執行
  function onResolve(resolveData){
    if(self.status === STATUS.PENDING){
      self.resolveData = resolveData
      self.status = STATUS.FULFILLED
      self.onFulfilledList.forEach(fn=>fn()) 
    }
  }
  //失敗時執行
  function onReject(rejectData ){
      if(self.status === STATUS.PENDING){
      self.rejectData = rejectData
      self.status = STATUS.REJECTED
      self.onRejectedList.forEach(fn=fn())
    }
  }
  try {
    exector(onResolve, onReject)
  }catch(e){
    onReject(e)
  }
}

// 添加then 方法
Promise.prototype.then = function(onSucess, onError){
  let self = this
  if(this.status === STATUS.FULFILLED){
    onSucess(self.resolveData)
  }
  if(this.status === STATUS.REJECTED){
    onError(self.rejectData)
  }
  // 如果異步執行則為pending 狀態
  if(this.status === STATUS.PENDING){
    // 保存回調函數
    this.onFulfilledList.push(()=>{
      onSucess(self.resolveData)
    })
    this.onRejectedList.push(()=>{
      onError(self.rejectData)
    })
  }
}
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容