我对如何在AngularJS中链接承诺感到有点困惑。我有$resource
实现...这是一些简单的代码来说明我的观点:
myResource
.save({ id: 123 })
.$promise
.then(function(data) {
// redirect to root on success
$location.url("/");
})
.catch(function() {
console.log("Failed");
})
.finally(function() {
// reenable form
$scope.enabled = true;
})
我感到困惑的是,当我的资源保存失败时是否会调用我的.catch()
函数,或者它是否只会捕获源自.then()
函数或可能同时发生的错误?
当链接这些时,我怎么能有一个.catch
(在.finally
之前)来捕获链中发生的所有调用错误呢?
注意:我知道我可以在
.save
函数中提供成功和错误函数,但我还有其他部分需要处理。
答案 0 :(得分:0)
首先,阅读Angular's implementation of promises的文档。
可以通过两种方式解决Promise - 成功(resolve
方法)或不(reject
方法)。
当无法保存资源时(即服务器没有响应2XX状态),那么将调用您的catch方法,因为承诺将被拒绝。
另请注意,您的catch
处理程序应拒绝承诺下一个可能的处理程序。当您从catch方法返回非拒绝值时,假定已处理错误,并且promise可以调用后续then
方法(如果有)。因此,如果在其他地方有可能使用promise,则代码应如下所示:
// inject $q
myResource
.save({ id: 123 })
.$promise
.then(function(data) {
// redirect to root on success
$location.url("/");
})
.catch(function() {
console.log("Failed");
return $q.reject();
})
.finally(function() {
// reenable form
$scope.enabled = true;
})
另请注意,您在then
方法中输了一个拼写错误 - 您写了" ulr"而不是" url"。