Es6

Promise的all和race方法

2020-11-27 09:28发布

经常会有人搞不清楚Promise.all()race()方法的使用,今天的话,咱们就总结一下两者的相同点和区别。

Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。而allrace方法更是promise强大的体现。

首先,这两个方法,都是并行执行多个异步操作。而不同的是,all方式遵循“谁跑得慢,以谁为准执行回调”,而race遵循的是“谁跑的快,以谁为准执行回调”。

例如:

在上面的示例中,依次调用showTime方法,则会100毫秒之后在控制台输出第二个异步执行,500毫秒之后输出:第一个异步执行。也就是说两个异步请求直接并没有直接的关联,哪个耗时时间短,哪个先执行完。

若使用all方法,则是将两个异步执行的方法封装为一个新的异步请求,例如:

const p = Promise.all([p1, p2, p3]);

Promise.all()方法接受一个数组作为参数,p1p2p3都是 Promise 实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。另外,Promise.all()方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例.

p的状态由p1p2p3决定,分成两种情况。

1)只有p1p2p3的状态都变成fulfilledp的状态才会变成fulfilled,此时p1p2p3的返回值组成一个数组,传递给p的回调函数。

2)只要p1p2p3之中有一个被rejectedp的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。

示例:

我们将两个showTIme的异步请求封装为一个新的异步请求,然后执行,代码,结果如下:

也就是说all方法将两个异步打包之后,同时请求,等待两个异步都完成之后,将结果封装为一个数组接收数据。总耗时为:500毫秒

 

若使用race方法执行上面代码,

则,执行结果为:

首先,raceall一样,也会将多个promise请求打包为一个新的异步来发送请求,不过不同的是,race采用的策略是,只取最先响应的请求的结果作为结果,例如在刚才的例子中,第二个异步执行时间更短,则最终结果就是第二个异步的请求,也即是竞争机制。