在Angular中,promises的错误和catch函数之间的概念差异是什么?

时间:2013-10-25 17:49:37

标签: angularjs promise

我终于得到了Angular promise错误处理,但这对我来说是违反直觉的。我预计错误将由失败回调处理,但我不得不使用catch。

我不太明白为什么执行catch而不是故障回调。

我的期望:

SomeAsyncService.getData().then(function (result) {
    // The call is successful.
    // Code in this block throws an error.
}, function (error) {
    // I expected to handle errors here.
});

最终起作用的是什么。

SomeAsyncService.getData().then(function (result) {
    // The call is successful.
    // Code in this block throws an error.
}).catch(function (error) {
    // Where the error is actually caught. 
});

如果有更合适的方法来处理承诺错误,请告诉我。

3 个答案:

答案 0 :(得分:16)

第二个参数应该几乎从不在应用程序代码中使用,而使用第一个。它主要是关于不同实现之间的promise库互操作性。

除非您特别需要.catch,否则应始终使用.then(succcess, fail)

请参阅The .then(success, fail) anti-pattern

此外,Q库(一个角度为$ q的基础上)has similar section in their readme

答案 1 :(得分:7)

我认为你有点误解承诺是如何运作的。

在您的第一个代码块中,只有一个promise对象,它是SomeAsyncService.getData()。此处未调用errorCallback,因为该承诺已解决。

在第二个代码块中,实际上有两个您正在使用的承诺对象。请注意.then()"返回一个新的promise,它通过successCallback,errorCallback"的返回值解析或拒绝。所以,你正在发生的事情是从SomeAsyncService.getData().then(...)返回的第二个承诺中捕获错误。

答案 2 :(得分:-1)

通过angularJS documentation for $q

  

方法

     

然后(successCallback,errorCallback,notifyCallback) - 无论如何   当承诺已经或将要解决或拒绝时,请拨打一个   成功或错误回调一旦结果异步   是可用的。

     

.....

     

catch(errorCallback) - promise.then(null,errorCallback)的简写

您发布的两段代码完全相同。