顾名思义,Promise.race就是赛跑的意思,意思就是说,Promise.race([p1, p2, p3])里面哪个结果获得的快,就返回那个结果,不管结果本身是成功状态还是失败状态。

Promise._race = promises => new Promise((resolve, reject) => {
    promises.forEach(item => {
        // resolve 是返回的 new Promise 的 resolve
        // 如果 resolve/catch 被调用了,那么就直接返回了
        Promise.resolve(item).then(resolve, reject);
    })  
})

补充

补充:Promise.race 接收一个 Promise 数组,返回最快"敲定"(fulfilled 或 rejected)的那个 Promise 的结果,后续结果被忽略。注意:

  • 任一子 Promise 失败都会立即 reject 外层 Promise;
  • 如果传入的数组为空,会一直处于 pending 状态(注意兼容问题,可手动用 Promise.resolve() 占位)。
const timeout = new Promise((_, reject) => setTimeout(() => reject(new Error('timeout')), 3000))
Promise.race([fetch('/api/data'), timeout])
  .then(res => console.log(res))
  .catch(err => console.error(err))

来源整理自:vue3js.cn 面试官系列