一. 原理

  • Promise.race(iterable)函数返回一个 Promise,一旦迭代器中的某个 promise解决或拒绝,就采用这个promise的值作为返回值。
  • 如果传的迭代是的,则返回的 promise 将永远等待。
  • 如果迭代包含一个或多个非承诺值和/或已解决/拒绝的承诺,则 Promise.race 将解析为迭代中找到的第一个值。
  • 也就是说,Promise.race()等待第一个完成或失败。

    二. 应用

  • 超时告知:将异步操作与定时器放在一起,若定时器先触发,就认为超时,告知用户。

    三. 手写代码

    1. /**
    2. * @param: Iterator
    3. * @return: Promise
    4. * @description:
    5. * 传入一个迭代器,内容为多个pending状态的promise实例,返回一个promise实例。
    6. * 当有一个promise执行完毕(成功或失败)时,返回执行结果。
    7. */
    8. Promise.newRace = (iterator) => {
    9. let promises = Array.from(iterator);
    10. return new Promise((resolve, reject) => {
    11. for(let i=0; i<promises.length; i++){
    12. promises[i]
    13. .then((response) => {
    14. resolve(response);
    15. })
    16. .catch((error) => {
    17. reject(error);
    18. })
    19. }
    20. });
    21. }

    四. 测试代码

    ```javascript const promise1 = new Promise(function (resolve, reject) { setTimeout(resolve, 2000, ‘promise1’); }); const promise2 = Promise.resolve(‘promise2’); const promise3 = new Promise(function (resolve, reject) { setTimeout(resolve, 1000, ‘promise3’); });

Promise.race([promise1, promise2, promise3]).then(function (values) { console.log(values); }); // promise2 Promise.newRace([promise1, promise2, promise3]).then(function (values) { console.log(values); }); // promise2 ```