1
0
mirror of https://github.com/ruanyf/es6tutorial.git synced 2025-05-24 10:22:23 +00:00

docs(Promise): edit Promise.all

This commit is contained in:
ruanyf 2017-06-04 18:59:41 +08:00
parent 38816c896a
commit 3e302652a0

View File

@ -453,13 +453,13 @@ someAsyncThing().then(function() {
## Promise.all()
`Promise.all`方法用于将多个Promise实例包装成一个新的Promise实例。
`Promise.all`方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
```javascript
var p = Promise.all([p1, p2, p3]);
```
上面代码中,`Promise.all`方法接受一个数组作为参数,`p1``p2``p3`都是Promise对象的实例,如果不是,就会先调用下面讲到的`Promise.resolve`方法将参数转为Promise实例再进一步处理。`Promise.all`方法的参数可以不是数组但必须具有Iterator接口且返回的每个成员都是Promise实例。
上面代码中,`Promise.all`方法接受一个数组作为参数,`p1``p2``p3`都是 Promise 实例,如果不是,就会先调用下面讲到的`Promise.resolve`方法,将参数转为 Promise 实例,再进一步处理。(`Promise.all`方法的参数可以不是数组,但必须具有 Iterator 接口,且返回的每个成员都是 Promise 实例。)
`p`的状态由`p1``p2``p3`决定,分成两种情况。
@ -472,7 +472,7 @@ var p = Promise.all([p1, p2, p3]);
```javascript
// 生成一个Promise对象的数组
var promises = [2, 3, 5, 7, 11, 13].map(function (id) {
return getJSON("/post/" + id + ".json");
return getJSON('/post/' + id + ".json");
});
Promise.all(promises).then(function (posts) {
@ -482,7 +482,7 @@ Promise.all(promises).then(function (posts) {
});
```
上面代码中,`promises`是包含6个Promise实例的数组只有这6个实例的状态都变成`fulfilled`,或者其中有一个变为`rejected`,才会调用`Promise.all`方法后面的回调函数。
上面代码中,`promises`是包含6个 Promise 实例的数组只有这6个实例的状态都变成`fulfilled`,或者其中有一个变为`rejected`,才会调用`Promise.all`方法后面的回调函数。
下面是另一个例子。
@ -504,6 +504,48 @@ Promise.all([
上面代码中,`booksPromise``userPromise`是两个异步操作,只有等到它们的结果都返回了,才会触发`pickTopRecommentations`这个回调函数。
注意,如果作为参数的 Promise 实例,自己定义了`catch`方法,那么它一旦被`rejected`,并不会触发`Promise.all()``catch`方法。
```javascript
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`方法。
```javascript
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: 报错了
```
## Promise.race()
`Promise.race`方法同样是将多个Promise实例包装成一个新的Promise实例。