手写Promise

const myPromise = /** @class */(function () {
  function myPromise(fn) {
    this.state = "PENDING" // 枚举类型 PENDING|RESOLVED|REJECTED
    this.value = null
    this.resolvedCallbacks = []
    this.rejectedCallbacks = []
    const resolve = (value) => {
      if (this.state === "PENDING") {
        this.state = "RESOLVED"
        this.value = value
        // 执行回调
        this.resolvedCallbacks.forEach(callback => callback())
      }
    }
    const reject = (value) => {
      if (this.state === "PENDING") {
        this.state = "REJECTED"
        this.value = value
        this.rejectedCallbacks.forEach(callback => callback())
      }
    }
    try {
      fn(resolve, reject)
    } catch(error) {
      reject(error)
    }
  }
  myPromise.prototype.then = function (onfulfilled, onrejected) {
    onfulfilled = typeof onfulfilled === 'function' ? onfulfilled : v => v
    onrejected = typeof onrejected === 'function' ? onrejected : v => v
    return new myPromise((resolve, reject) => {
      if (this.state === 'PENDING') {
        // 收集回调
        this.resolvedCallbacks.push(() => resolve(onfulfilled(this.value)))
        this.rejectedCallbacks.push(() => reject(onrejected(this.value)))
      }
      if (this.state === 'RESOLVED') {
        resolve(onfulfilled(this.value))
      }
      if (this.state === 'REJECTED') {
        reject(onrejected(this.value))
      }
    })
  }
  myPromise.prototype.catch = function (onrejected) {
    return this.then(null, onrejected)
  }
  return myPromise
})()

注:

  1. Promise有三个状态且不可逆(PENDING,RESOLVED,REJECTED)
  2. Promise的参数是个高阶函数,函数的参数是Promise内部定义的resolve和reject两个函数
  3. resolve函数执行后Promise的状态改变成RESOLVED,收集执行成功的值value,执行then函数收集的成功回调函数数组(onfulfilled数组)
  4. reject函数执行后Promise的状态改变成REJECTED),收集执行失败的值value,执行then函数收集的失败回调函数数组(onrejected数组)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值