Angular $http服务的"then"方法需要 2 个参数(成功和错误回调)。既然有错误回调,那么使用"catch"有什么意义?


Angular$http服务有一个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,而另一个问题是关于errorcatch。尽管如此,在另一个主题中有一个响应暗示了then的失败回调。我投票决定保持开放,以获得更好的回复,并帮助用户专门寻找"then的失败回调与catch"问题。

之间的差异

promise.then(onSuccess, onError)

promise.then(onSuccess).catch(onError)

在第一种情况下,onError处理promise的异常/拒绝,而在第二种情况下-onError处理原始promiseonSuccess生成的异常/拒。

这看起来可能不多,但当你连锁承诺时,区别就变得至关重要了。

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来处理doSomething2doSomething1的错误(如果没有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的情况下,也可以使用successerror

免责声明:这取决于所使用的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

相关内容

  • 没有找到相关文章

最新更新