角度承诺和错误

时间:2014-12-08 12:43:34

标签: angularjs error-handling angular-promise

我对如何在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函数中提供成功和错误函数,但我还有其他部分需要处理。

1 个答案:

答案 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"。