一. 原理
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 ```