mtonhuang / blog

博客,想法,笔记

Home Page:http://huangmiantong.cn/ (已废弃)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

实现Promise.all()、race()、any()

mtonhuang opened this issue · comments

实现Promise.all()

1、Promise.all​​​ 接受一个数组,返回值是一个新的 ​​Promise​​ 实例

Promise.MyAll = function (promises) {
  return new Promise((resolve, reject) => {

  })
}

2、需要一个数组来收集参数数组中所有 ​​Promise​​​ 实例,即实例都成功,​​Promise.all​​ 才成功

Promise.MyAll = function (promises) {
  let arr = []
  return new Promise((resolve, reject) => {
    promises.forEach((item, i) => {
      Promise.resolve(item).then(res => {
        arr[i] = res
      })
    }) 
  })
}

3、兼容处理失败的情况

Promise.MyAll = function (promises) {
  let arr = [],
    count = 0
  return new Promise((resolve, reject) => {
    promises.forEach((item, i) => {
      Promise.resolve(item).then(res => {
        arr[i] = res
        count += 1
        if (count === promises.length) resolve(arr)
      }).catch(reject)
    })
  })
}
// 或者这样捕获错误
Promise.MyAll = function (promises) {
  let arr = [],
    count = 0
  return new Promise((resolve, reject) => {
    promises.forEach((item, i) => {
      Promise.resolve(item).then(res => {
        arr[i] = res
        count += 1
        if (count === promises.length) resolve(arr)
      }, reject)
    })
  })
}

实现Promise.race()

// 实现Promise.race 输出最快promise
Promise.testRace = function (promiseArr) {
  return new promise((resolve, reject) => {
    promiseArr.forEach((item) => {
      Promise.resolve(item)
        .then((res) => {
          resolve(res);
        })
        .catch(() => {
          reject();
        });
    });
  });
};

实现Promise.any()

// 实现Promise.any 全部失败输出,否则任意一个
Promise.testAny = function (promiseArr) {
  return new promise((resolve, reject) => {
    let arr = [],
      num = 0;
    promiseArr.forEach((item, index) => {
      Promise.resolve(item)
        .then()
        .catch((err) => {
          arr[index] = { status: 'reject', val: err };
          num += 1;
          if (num === promiseArr.length) reject(new Error('没有promise成功'));
        });
    });
  });
};```