简易Promise

84 阅读1分钟

主要是为了了解resolve的微任务机制与then的延时绑定。

function Bromise(executor){
  let self = this
  self.status = 'pending'
  //resolve调用的函数
  self.onResolve_ = null
  //reject调用的函数
  self.onReject_ = null

  //then的返回值
  self.newV_ = null

  //传给使用者
  executor(resolve,reject)

  //触发resolve时,放进微任务队列
  function resolve(value){
    //这里用宏任务模拟异步 
    //注意真实情况是用微任务实现的
    if(self.status==='pending'){
      self.status = 'fulfilled'
      setTimeout(()=>{
        //得到resolve的返回值,回then函数转化成then的返回值,要是一个Promise,我猜用协程实现的,不会写
        //没有then的情况下,没有resolve,不需要调用,也无法调用
        if(self.onResolve_!=null)
          self.newV_ = self.onResolve_(value)
      },0)
    }
  }


  function reject(err){
    if(self.status==='pending'){
      self.status = 'rejected'
      setTimeout(()=>{
        if(self.onReject_!=null)
          self.onReject_(err)
      },0)
    }
  }

  
}

//延时绑定
Bromise.prototype.then = function(onResolve,onReject){
  this.onResolve_ = onResolve
  this.onReject_ = onReject
}


let test = new Bromise((resolve,reject)=>{
  console.log(1);
  resolve(3)
}).then( value => {
  console.log(value);
})
console.log(2);

参考资料:极客时间 《浏览器工作原理与实践》