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.all`方法用于将多个Promise实例,包装成一个新的Promise实例。
|
`Promise.all`方法用于将多个 Promise 实例,包装成一个新的 Promise 实例。
|
||||||
|
|
||||||
```javascript
|
```javascript
|
||||||
var p = Promise.all([p1, p2, p3]);
|
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`决定,分成两种情况。
|
`p`的状态由`p1`、`p2`、`p3`决定,分成两种情况。
|
||||||
|
|
||||||
@ -472,7 +472,7 @@ var p = Promise.all([p1, p2, p3]);
|
|||||||
```javascript
|
```javascript
|
||||||
// 生成一个Promise对象的数组
|
// 生成一个Promise对象的数组
|
||||||
var promises = [2, 3, 5, 7, 11, 13].map(function (id) {
|
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) {
|
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`这个回调函数。
|
上面代码中,`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.race`方法同样是将多个Promise实例,包装成一个新的Promise实例。
|
`Promise.race`方法同样是将多个Promise实例,包装成一个新的Promise实例。
|
||||||
|
Loading…
x
Reference in New Issue
Block a user