# 题目描述

请你实现Promise.race()

MDN上的描述👇

Promise.race()静态方法接受Promise的可迭代对象(Array)作为输入,并返回一个Promise这个返回的承诺与第一个返回的最终状态一致

返回第一个存储的Promise结果,不管他是resolve还是reject

promise .race()方法是promise并发性方法之一。当你想要完成第一个异步任务,但不关心它的最终状态(即它可以成功或失败)时,它是有用的

如果可迭代对象包含一个或多个非承诺值和/或已经确定的承诺,则promise .race()将确定在可迭代对象中找到的这些值中的第一个

# 代码实现

const race = function (iterator) {
  if (!Array.isArray(iterator)) {
    throw new TypeError("argument must be an array!");
  }

  if (iterator.length === 0) {
    return new Promise(() => {});
  }

  return new Promise((resolve, reject) => {
    iterator.forEach((item) => {
      Promise.resolve(item).then(
        (data) => {
          resolve(data);
        },
        (reason) => {
          reject(reason);
        }
      );
    });
  });
};

const p1 = new Promise((resolve) => {
  setTimeout(() => {
    resolve("2");
  }, 3000);
});
const p2 = 3;
const p3 = new Promise((resolve) => {
  setTimeout(() => {
    resolve("5");
  }, 1000);
});
const p4 = new Promise((resolve) => {
  setTimeout(() => {
    resolve("4");
  }, 2000);
});

race([p1, p3, p4]).then((data) => console.log("race: ", data));
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41