promise如何进行异常处理
参照promise的文档我们可以在reject回调和catch中处理异常。但是promise规定如果一个错误在reject函数中被处理,那么promise将从异常常态中恢复过来。这意味着接下来的then方法将接收到一个resolve回调。大多数时候我们希望发生错误的时候,promise处理当前的异常并中断后续的then操作。
我们先来看一个使用reject处理异常的例子
var promiseStart = new Promise(function(resolve, reject){ reject('promise is rejected'); }); promiseStart .then(function(response) { console.log('resolved'); return new Promise(function(resolve, reject){ resolve('promise is resolved'); }); },function (error){ console.log('rejected1:', error); // 如果这里不抛出error,这个error将被吞掉,catch无法捕获异常 // 但是如果抛出error,这个error会被下一个then的reject回调处理,这不是我们想要的 throw(error); }) .then(function (response){ console.log('resolved:', response); },function (error){ console.log('rejected2:', error); throw(error); }) .catch(function(error) { console.log('catched:', error); }) /* 输出: rejected: promise is rejected rejected: promise is rejected catched: promise is rejected */
在这个例子中reject回调处理了异常,但是它并不能中断后续then操作。第二个then中的reject被触发了。
而正确的做法是,不要使用reject!让错误直接到catch中捕获。
var promiseStart = new Promise(function(resolve, reject){
reject('promise is rejected');
});
promiseStart
.then(function(response) {
console.log('resolved');
return new Promise(function(resolve, reject){
resolve('promise is resolved');
});
})
.then(function (response){
console.log('resolved:', response);
})
.catch(function(error) {
console.log('catched:', error);
})
/*
输出:
catched: promise is rejected
*/