Promise.race

Promise.race = function(promises) {
    // 简单地判断是否是数组,实际上要判断是否是可迭代的
    if (!Array.isArray(promises)) {
        throw '传入的参数需要是数组';
    }
    return new Promise(function(resolve, reject) {
        for (let i = 0; i < promises.length; i++) {
            Promise.resolve(promises[i]).then(function(value) {
                return resolve(value);
            }, function(reason) {
                return reject(reason);
            });
        }
    });
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

注意事项:

  • 若第一个参数不是可迭代的,需要报错
  • 若传入的可迭代参数是空的,则返回的promise将永远等待
  • 若迭代包含一个或多个非承诺值和/或已解决/拒绝的承诺,则 Promise.race 将解析为迭代中找到的第一个值