es6 Promise.all()方法
2018-01-27 22:27
375 查看
Promise.all()方法
Promise.all方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
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的回调函数。
下面是一个具体的例子。
// 生成一个Promise对象的数组
const promises = [2, 3, 5, 7, 11, 13].map(function (id) {
return getJSON('/post/' + id + ".json");
});
Promise.all(promises).then(function (posts) {
// ...
}).catch(function(reason){
// ...
});
上面代码中,
promises是包含 6 个 Promise 实例的数组,只有这 6 个实例的状态都变成
fulfilled,或者其中有一个变为
rejected,才会调用
Promise.all方法后面的回调函数。
下面是另一个例子。
const databasePromise = connectDatabase();
const booksPromise = databasePromise
.then(findAllBooks);
const userPromise = databasePromise
.then(getCurrentUser);
Promise.all([
booksPromise,
userPromise
])
.then(([books, user]) => pickTopRecommentations(books, user));
上面代码中,
booksPromise和
userPromise是两个异步操作,只有等到它们的结果都返回了,才会触发
pickTopRecommentations这个回调函数。
注意,如果作为参数的 Promise 实例,自己定义了
catch方法,那么它一旦被
rejected,并不会触发
Promise.all()的
catch方法。
const p1 = new Promise((resolve, reject) => {
resolve('hello');
})
.then(result => result)
.catch(e => e);
const p2 = new Promise((resolve, reject) => {
throw new Error('报错了');
})
.then(result => result)
.catch(e => e);
Promise.all([p1, p2])
.then(result => console.log(result))
.catch(e => console.log(e));
// ["hello", Error: 报错了]
上面代码中,
p1会
resolved,
p2首先会
rejected,但是
p2有自己的
catch方法,该方法返回的是一个新的
Promise 实例,
p2指向的实际上是这个实例。该实例执行完
catch方法后,也会变成
resolved,导致
Promise.all()方法参数里面的两个实例都会
resolved,因此会调用
then方法指定的回调函数,而不会调用
catch方法指定的回调函数。
如果
p2没有自己的
catch方法,就会调用
Promise.all()的
catch方法。
const p1 = new Promise((resolve, reject) => {
resolve('hello');
})
.then(result => result);
const p2 = new Promise((resolve, reject) => {
throw new Error('报错了');
})
.then(result => result);
Promise.all([p1, p2])
.then(result => console.log(result))
.catch(e => console.log(e));
// Error: 报错了
相关文章推荐
- 【前端】ES5 实现类似 ES6 中 Promise.all 的效果的若干种方法
- 深入理解ES6 Promise 扩展always方法
- ES6原生Promise的所有方法介绍(附一道应用场景题目)
- Promise.all中对于reject的处理方法
- 让微信小程序支持ES6中Promise特性的方法详解
- es6 Promise.reject()方法
- 利用ES6的Promise.all实现至少请求多长时间
- [javascript高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)
- es6 Promise.try()方法
- es6 promise 异步方法处理
- 利用ES6的Promise.all实现至少请求多长时间的实例
- 实现 Promise/A+ 规范 & ES6 Promise方法
- es6 Promise.prototype.catch()方法
- promise Q.all 方法使用 及 spread 分散返回结果
- es6 Promise.resolve()方法
- [js高手之路] es6系列教程 - promise常见用法详解(resolve,reject,catch,then,all,race)
- union all用法,两个查询结果,一起显示,(一般最后添加一行汇总数据可以用这个方法)
- ES6 新增的字符串方法
- python基础-生成包、导入模块、包下_init_模块(__all__方法)
- ES6 JavaScript Promise的感性认知