Promise分析与实现(中篇)

完成catch和一些静态方法

// 添加catch方法
catch (onRejected) {
  // 相当于then(null, reject)
  return this.then(undefined, onRejected)
}
// 添加静态resolve方法
static resolve(value) {
  // 如果参数是MyPromise实例,直接返回这个实例
  if (value instanceof LuPromise) return value
  return new LuPromise(resolve => resolve(value))
}
// 添加静态reject方法
static reject(value) {
  return new Luromise((resolve, reject) => reject(value))
}
// 添加静态all方法
static all(list) {
  return new LuPromise((resolve, reject) => {
    // 创建数组
    let arr = []
    let count = 0
    for (let [i, p] of list.entries()) {
      // 数组参数如果不是LuPromise实例,先调用LuPromise.resolve
      this.resolve(p).then(res => {
        arr[i] = res
        count++
        // 所有状态都变成fulfilled时返回的LuPromise状态就变成ful
        if (count === list.length) resolve(arr)
      }, err => {
        // 有一个被rejected时返回的MyPromise状态就变成rejected
        reject(err)
      })
    }
  })
}
// 添加静态race方法
static race(list) {
  return new LuPromise((resolve, reject) => {
    for (let p of list) {
      // 只要有一个实例率先改变状态,新的LuPromise的状态就跟着改
      this.resolve(p).then(res => {
        resolve(res)
      }, err => {
        reject(err)
      })
    }
  })
}

finally(CallBack) {
  return this.then(
    value => LuPromise.resolve(CallBack()).then(() => value),
    reason => LuPromise.resolve(CallBack()).then(() => {
      throw reason
    })
  )

:TODO

下篇,将克服一些困难,把这些方法各种边缘情况补齐,一个月内

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值