Promise的错误处理

1/30/2023

# Promise的错误捕获

Promise对象的catch()方法用于在Promise对象发生错误时调用一个回调函数。catch()方法可以被多次调用,以便建立一个错误处理的依赖关系。

getJSON("/posts.json").then(function(posts) {
  // ...
}).catch(function(error) {
  // 处理 getJSON 和 前一个回调函数运行时发生的错误
  console.log('发生错误!', error);
});
1
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

# Promise.all()方法

Promise.all()方法用于将多个Promise实例,包装成一个新的Promise实例。

const p = Promise.all([p1, p2, p3]);
1

上面代码中,Promise.all()方法接受一个数组作为参数,p1p2p3都是Promise实例,如果不是,就会先调用下面讲到的Promise.resolve()方法,将参数转为Promise实例,再进一步处理。(Promise.all()方法的参数可以不是数组,但必须具有Iterator接口,且返回的每个成员都是Promise实例。)

p的状态由p1p2p3决定,分成两种情况。

(1)只有p1p2p3的状态都变成fulfilledp的状态才会变成fulfilled,此时p1p2p3的返回值组成一个数组,传递给p的回调函数。

(2)只要p1p2p3之中有一个被rejectedp的状态就变成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

上面代码中,booksPromiseuserPromise是两个异步操作,只有等到它们的结果都返回了,才会触发pickTopRecommentations这个回调函数。

编辑时间: 4/12/2016, 9:05:20 AM