您的位置:首页 > 其它

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: 报错了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: