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

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

©️2020 CSDN 皮肤主题: 数字50 设计师:CSDN官方博客 返回首页