mirror of
https://github.com/ruanyf/es6tutorial.git
synced 2025-05-24 18:32:22 +00:00
docs(Promise): edit Promise.all
This commit is contained in:
parent
38816c896a
commit
3e302652a0
@ -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实例。
|
||||
|
Loading…
x
Reference in New Issue
Block a user