一般 Promise 是采用 Promise 链的顺序控制流程的,Promise 还有其他异步模式,用来简化异步的流程控制,易于追踪。
一. Promise.all([…])
在异步序列中,任意时刻只能有一个异步任务执行,如果想同时执行,怎么实现呢?可以用到 Promise.all([…]),它并不能让两个异步任务同时执行,但是可以让两个异步任务执行完了之后再让后面的流程继续执行,相对于这两个异步任务之外的流程来说,它们是同时执行的。
// 假定 ajax 是Promise
var p1 = ajax("http://xxx.111.xxx");
var p2 = ajax("http://xxx.222.xxx");
Promise.all([p1,p2])
.then(function(data){
// p1 p2 执行之后传入它们收到的消息
return ajax('http://xxx.333.xxx' + data.join(','));
})
.then(function(data){
console.log(data);
})
- Promise.all([…])需要传入一个数组,一般由 Promise 实例组成。数组中的所有 Promise 完成后,主 Promise 才会完成,如果其中有一个 Promise 拒绝,主 Promise 会立刻拒绝,其他完成的结果也会被抛弃。
二. Promise.race([…])
与 .all() 相对应,有时候期望同时执行许多 Promise ,但是只要有一个完成就够了,这种时候可以用到 Promise.race([…])。
- 接收的参数和 all 一样,可以是 Promise ,带 then 的对象或立即值,但是立即值没有什么意义,因为它们的顺序会是数组最前面一个最先完成。
- 同样,只要有一个 Promise 完成,.race(…) 就会立刻完成,一旦有一个为拒绝,.race(…) 就会拒绝。
- 如果 .race(…) 传入的是空数组,.race(…) 永远不会决议,不会立即决议。