手写Promise简单版

100 阅读1分钟
class Promise2 {
  #status = 'pending'
  constructor(fn){
    this.q = []
    const resolve =(data)=>{
      this.#status = 'fulfilled'
      const f1f2 = this.q.shift()
      if(!f1f2 || !f1f2[0]) return
      const x = f1f2[0].call(undefined, data)
      if(x instanceof Promise2){
        x.then((data)=>{
          resolve(data)
        }, (reason)=>{
          reject(reason)
        })
      }else{
        resolve(x)
      }
    }
    const reject =(reason)=>{
      this.#status = 'rejected'
      const f1f2 = this.q.shift()
      if(!f1f2 || !f1f2[1]) return
      const x = f1f2[1].call(undefined, reason)
      if(x instanceof Promise2){
        x.then((data)=>{
          resolve(data)
        }, (reason)=>{
          reject(reason)
        })
      }else{
        resolve(x)
      }
    }
    fn.call(undefined, resolve, reject)
  }
  then(f1, f2){
    this.q.push([f1,f2])
  }
}

// 用法
// const p = new Promise2((resolve, reject)=>{
//   // 成功
//   resolve(data)
//   // 失败
//   reject(reason)
// })

// p.then(f1, f2).then(f3, f4)
// p.then(f1, undefined).then(undefined, f4)

const p = new Promise2(function(resolve, reject){
  setTimeout(()=>{
    // resolve('hi')
    reject('hello')
  },3000)
})
p.then((data)=>{console.log(data)}, (reason)=>{console.error(reason)})

then的链式调用没有实现