美文网首页
手写一个promise

手写一个promise

作者: lmmy123 | 来源:发表于2018-11-22 22:45 被阅读15次
    // 声明三种状态机
    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)
        })
      }
    }
    

    相关文章

      网友评论

          本文标题:手写一个promise

          本文链接:https://www.haomeiwen.com/subject/hkeqqqtx.html