前端面试题 - 104. 实现一个Promise.race函数

412 阅读1分钟

接收一个Promise数组,并返回一个新的Promise,当任何一个Promise成功或失败时,将其结果传递给返回的Promise。

关键点:Promise包裹for循环,每个子Promise都执行并且执行后就调用父级的resolve, reject

function promiseRace(promises) {
  return new Promise((resolve, reject) => {
      promises.forEach(p => {
          // 让每个任务都变成Promise任务。等他们任何一个执行完就会走到then和catch结束
          Promise.resolve(p).then(resolve).catch(reject);
      })
  });
}

给几个测试用例

const promise1 = new Promise((resolve, reject) => {
  setTimeout(resolve, 500, 1);
});

const promise2 = new Promise((resolve, reject) => {
  setTimeout(resolve, 100, 2);
});

promiseRace([promise1, promise2]).then((value) => {
  console.log(value) // 2
});

promiseRace([promise1, promise2, 3]).then((value) => {
  console.log(value) // 3
});