then
方法,它接受两个参数作为回调(一个用于成功,一个用于错误)。既然已经有错误回调了,那么使用catch
方法有什么意义呢?为什么要使用它?
下面是一个then
-catch
实现:
$http.get("url").then(
function(results) {
//do something w/results.data
}).catch(function(e){
// handle errors in processing or in error.
});
这里有一个then
实现,有两个参数:
$http.get("url").then(
//success function
function(results) {
//do something w/results.data
},
//error function
function(err) {
//handle error
}
);
编辑:这里的问题与New Dev提出的不同。这里的问题具体是关于then
的失败回调与catch
,而另一个问题是关于error
与catch
。尽管如此,在另一个主题中有一个响应暗示了then
的失败回调。我投票决定保持开放,以获得更好的回复,并帮助用户专门寻找"then
的失败回调与catch
"问题。
之间的差异
promise.then(onSuccess, onError)
和
promise.then(onSuccess).catch(onError)
在第一种情况下,onError
处理promise
的异常/拒绝,而在第二种情况下-onError
处理原始promise
和onSuccess
生成的异常/拒。
这看起来可能不多,但当你连锁承诺时,区别就变得至关重要了。
Promise可以被认为是try
/catch
块的异步等价物,这就是它们的真正强度
考虑以下同步调用序列:
var result;
try {
var d1 = doSomething1();
var d2 = doSomething2(d1);
var d3 = doSomething3(d2);
result = d3;
}
catch(e){
// land here if any of the above throws an exception
result = "not set";
}
对于promise和doSomethingN
的异步版本,以下内容将是等效的:
var result;
doSomething1()
.then(doSomething2)
.then(doSomething3)
.then(function(d3){
result = d3;
})
.catch(function(){
// land here if anything above throws an exception or returns a rejection
result = "not set";
});
因此,任何doSomethingN
中的异常或拒绝承诺都将到达catch
处理程序。
这就是.then
的错误处理程序变得违反直觉的地方。所以,如果你有这样的东西:
var result;
doSomething1()
.then(doSomething2)
.then(doSomething3, errorHandler3)
.then(function(d3){
result = d3;
})
.catch(function() {
result = "not set";
});
则调用errorHandler3
来处理doSomething2
或doSomething1
的错误(如果没有errorHandler2
)。而CCD_ 28则不然。事实上,它应该">处理"错误,就像在中一样,它应该返回一个有效的类似d3
的结果,而不是doSomething3
会返回的结果。要么这样,要么"重新抛出"(使用return $q.reject()
)。
同步等价物将是以下混乱(我希望我做对了):
var d2, d3;
try {
var d1 = doSomething1();
d2 = doSomething2(d1);
}
catch(e){
d3 = errorHandler3(e);
}
try {
if (!d3) d3 = doSomething3(d2);
}
catch (e){
d3 = "not set";
}
result = d3;
then
具有互操作性,因为它是JS Promise API所期望的(来源):
JavaScript承诺API将把任何带有
then
方法的东西作为promise like(或promise中的the ablesake*sight*),因此如果您使用返回Q承诺的库,这很好,它会玩得很好新的JavaScript承诺。
catch
则更可取,因为它更具表现力。请参阅:在Angular中,promise的error和catch函数在概念上有什么区别?
在Angular的$http的情况下,也可以使用success
和error
。
免责声明:这取决于所使用的promise库的实现。
使用.catch()
的主要好处是,它允许您在promise链中的任何位置捕获任何未处理的错误。
$http({ ... })
.then( thing1 )
.then( thing2 )
.then( thing3 )
.then( thing4 )
.then( thing5 )
.catch( function( err ){
console.log( 'An error occurred while processing the response' )
})
这里的catch,我假设你指的是try/catch块。您可以使用try-catch块来尝试捕获运行时执行期间发生的异常,并以有意义的方式进行处理。
$http没有以这种try/catch方式封装您的代码。它尝试发出请求,并调用success函数。如果它收到指示请求成功的状态代码,则调用error函数以指示请求不成功。您必须检查提供的参数以确定原因。
https://docs.angularjs.org/api/ng/service/$http
介于200和299之间的响应状态代码被视为成功状态,并将导致调用成功回调。请注意,如果响应是重定向,XMLHttpRequest将透明地跟随它,这意味着不会为此类响应调用错误回调。
调用错误函数时,仍然由您决定如何处理该错误。
$q还有一个.catch和.finally选项。.catch(onRejected)是promise.then(null,errorCallback)的别名,它仍然会将错误处理交给您。
blockquote promise.catch(onRejected)别名:promise.fail(用于非ES5browsers)一个sugar方法,相当于promise.then(未定义,onRejected)。
https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback