一. 原理
Promise.race(iterable)函数返回一个Promise,一旦迭代器中的某个promise解决或拒绝,就采用这个promise的值作为返回值。- 如果传的迭代是空的,则返回的 promise 将永远等待。
- 如果迭代包含一个或多个非承诺值和/或已解决/拒绝的承诺,则 Promise.race 将解析为迭代中找到的第一个值。
也就是说,
Promise.race()等待第一个完成或失败。二. 应用
超时告知:将异步操作与定时器放在一起,若定时器先触发,就认为超时,告知用户。
三. 手写代码
/*** @param: Iterator* @return: Promise* @description:* 传入一个迭代器,内容为多个pending状态的promise实例,返回一个promise实例。* 当有一个promise执行完毕(成功或失败)时,返回执行结果。*/Promise.newRace = (iterator) => {let promises = Array.from(iterator);return new Promise((resolve, reject) => {for(let i=0; i<promises.length; i++){promises[i].then((response) => {resolve(response);}).catch((error) => {reject(error);})}});}
四. 测试代码
```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 ```
