手写 Promise 中 all、race、any 方法

523 阅读1分钟

all()

 class MyPromise {
  // 全部任务执行结果返回后返回
  static all(array) {
    let result = [], index = 0;
    return new MyPromise((resolve, reject) => {
      function addData(i, v) {
        result[i] = v;
        index++;
        if (index === array.length) {
          resolve(result)
        }
      }
      for (let i = 0; i < array.length; i++) {
        let item = array[i]
        if (item instanceof MyPromise) {
          // MyPromise对象
          item.then(value => addData(i, value), reject)
        } else {
          // 其他类型
          addData(i, item)
        }
      }
    })
  }
}

Promise.all(["Jackson", "Yee"]).then((data) => {
  console.log(data);
})

race()

class MyPromise {
  // 多任务处理,只要一个处理完成就完成
  static race(array) {
    return new Promise((resolve, reject) => {
      for (let i = 0; i < array.length; i++) {
        let item = array[i]
        if (item instanceof MyPromise) {
          // MyPromise类型
          item.then(resolve, reject)
        } else {
          // 其他类型
          resolve(item)
        }
      }
    })
  }
}

function time(time) {
  return new Promise(resolve => {
    setTimeout(() => {
      resolve(time)
    }, 1000 * time)
  })
}

Promise.race([time(1), time(2), time(3)]).then(res => console.log(res))

any()

class MyPromise {
  // 只要其中的一个 promise 成功,就返回那个已经成功的 promise
  // 如果所有的 promises 都失败/拒绝),就返回一个失败的 promise(错误集合)
  static any(arr) {
    return new Promise((resolve, reject) => {
      let result = [], index = 0;
      let len = arr.length;

      function func(i, err) {
        result[i] = err;
        index++;
        if (index === len) {
          reject(result)
        }
      }
      for (let i = 0; i < len; i++) {
        let item = arr[i]
        if (item instanceof Promise) {
          item.then(resolve, err => func(i, err))
        } else {
          resolve(item)
        }
      }
    })
  }
}

function cra(time, type) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      type && resolve(time)
      !type && reject(time)
    }, 1000 * time)
  })
}

MyPromise.any([cra(2, false), cra(4, true), cra(6, false)]).then(res => {
  console.log(res);
}, err => {
  console.log(err);
})