经常会有人搞不清楚Promise.all()和race()方法的使用,今天的话,咱们就总结一下两者的相同点和区别。
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。而all和race方法更是promise强大的体现。
首先,这两个方法,都是并行执行多个异步操作。而不同的是,all方式遵循“谁跑得慢,以谁为准执行回调”,而race遵循的是“谁跑的快,以谁为准执行回调”。
例如:
在上面的示例中,依次调用showTime方法,则会100毫秒之后在控制台输出”第二个异步执行”,500毫秒之后输出:”第一个异步执行”。也就是说两个异步请求直接并没有直接的关联,哪个耗时时间短,哪个先执行完。
若使用all方法,则是将两个异步执行的方法封装为一个新的异步请求,例如:
const p = Promise.all([p1, p2, p3]);
Promise.all()方法接受一个数组作为参数,p1、p2、p3都是 Promise 实例,如果不是,就会先调用下面讲到的Promise.resolve方法,将参数转为 Promise 实例,再进一步处理。另外,Promise.all()方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例.
p的状态由p1、p2、p3决定,分成两种情况。
(1)只有p1、p2、p3的状态都变成fulfilled,p的状态才会变成fulfilled,此时p1、p2、p3的返回值组成一个数组,传递给p的回调函数。
(2)只要p1、p2、p3之中有一个被rejected,p的状态就变成rejected,此时第一个被reject的实例的返回值,会传递给p的回调函数。
示例:
我们将两个showTIme的异步请求封装为一个新的异步请求,然后执行,代码,结果如下:
也就是说all方法将两个异步打包之后,同时请求,等待两个异步都完成之后,将结果封装为一个数组接收数据。总耗时为:500毫秒
若使用race方法执行上面代码,
则,执行结果为:
首先,race和all一样,也会将多个promise请求打包为一个新的异步来发送请求,不过不同的是,race采用的策略是,只取最先响应的请求的结果作为结果,例如在刚才的例子中,第二个异步执行时间更短,则最终结果就是第二个异步的请求,也即是”竞争”机制。