Promise.all和Promise.race是一对经常放在一起的方法。Promise.all,接受一个数组作为参数,当参数中所有promise抖完成,该promise完成,返回值是全部值的数据。其实很好理解,实验一下也很容易就成功了。
但是对于promise.race。我一开始的理解也是很浅显的,race,赛跑,race中接受的也是参数,但是当跑得最快的那个结束了,整个就结束了。但其实并不是这样。
function runAsync(x) {
const p = new Promise(
r => setTimeout(() => r(x, console.log(x)), 1000))
return p
}
Promise.race([runAsync(1), runAsync(2), runAsync(3), runAsync(4)])
.then(res => console.log('result', res))```
例如如上的代码块,按照我刚才的理解,应该输出1,然后再输出 result 1就结束了,但真实的结果是这样的
1
result 1
2
3
4
也就是说,其实数组里每个都执行过了,但是then只会接收到第一个,这也是和Promise.all不同之处。为了验证,稍微修改了一下代码。
function runAsync(x) {
const p = new Promise(r => setTimeout(() => r(x, console.log(x)), -x + 10))
return p
}
Promise.race([runAsync(1), runAsync(2), runAsync(3), runAsync(4)])
.then(res => console.log('result', res))
之前学习的时候,说到Promise.race的用处,其中一条是,超过一定时间,就不做了,可以节约时间。如果直接向上面那样写,是达不到想要的结果的,因为Promise.race其实数组里的每一个都会做,可以接合reject一起使用,达到这样的效果。