我终于得到了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.
});
如果有更合适的方法来处理承诺错误,请告诉我。
答案 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)的简写
您发布的两段代码完全相同。