# Promise的错误捕获
Promise对象的catch()方法
用于在Promise对象发生错误时调用一个回调函数。catch()方法
可以被多次调用,以便建立一个错误处理的依赖关系。
getJSON("/posts.json").then(function(posts) {
// ...
}).catch(function(error) {
// 处理 getJSON 和 前一个回调函数运行时发生的错误
console.log('发生错误!', error);
});
1
2
3
4
5
6
2
3
4
5
6
# Promise的错误传递
Promise对象的错误具有“冒泡”性质,会一直向后传递,直到被捕获为止。也就是说,错误总是会被下一个catch()
语句捕获。
p.then((val) => console.log("fulfilled:", val))
.catch((err) => console.log("rejected:", err))
.then(() => console.log("always executed"));
1
2
3
2
3
# Promise.all()方法
Promise.all()
方法用于将多个Promise实例,包装成一个新的Promise实例。
const p = Promise.all([p1, p2, p3]);
1
上面代码中,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
,此时第一个被rejected
的实例的返回值,会传递给p
的回调函数。
const databasePromise = connectDatabase();
const booksPromise = databasePromise
.then(findAllBooks);
const userPromise = databasePromise
.then(getCurrentUser);
Promise.all([
booksPromise,
userPromise
])
.then(([books, user]) => pickTopRecommentations(books, user));
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
上面代码中,booksPromise
和userPromise
是两个异步操作,只有等到它们的结果都返回了,才会触发pickTopRecommentations
这个回调函数。