拒绝在 angular $resource 的 $update 函数中延迟

Reject deferred in $update function of an angular $resource

在我的 angular 应用程序中,我按如下方式更新任务

task.$update().then(function (task) {
   // success
}, function (response) {
   // failure
});

我从后端得到一个 422 返回,但调用了第一个回调。

我的资源是这样的

angular.module('App')
    .factory('Task', function ($resource) {
        var resource = $resource('/admin/tasks/:id', { id: '@id' }, {
            new: {
                 method: 'GET',
                 url: '/admin/tasks/new'
            },
            update: {
                 method: 'PUT'
            },
            ...
        });

    return resource;
});

问题是,第二次回调是在什么情况下调用的?如果需要,我可以在 update 方法中做什么来调用第二个回调?

更新:一直调用成功回调的原因是因为我有一个错误拦截器

angular
.module('App')
    .factory('errorInterceptor', function ($location, $q, $rootScope) {
        return { 
            responseError: function (response) {
                if (response.config.url.match($location.$$host)) {
                    $rootScope.error = response;

                    return $q.reject(response);
                }

                return $q.when(response);
            } 
        };
    });

显然,如果你这样做 return $q.when(response); 你告诉 angular 一切都很好,对吧?

回调被指定为 $update() 函数的参数,如下所示:

$task.$update(function(task) {}, function(response) {})

参见$resource的官方文档:

The action methods on the class object or instance object can be invoked with the following parameters:

  • HTTP GET "class" actions: Resource.action([parameters], [success], [error])
  • non-GET "class" actions: Resource.action([parameters], postData, [success], [error])
  • non-GET instance actions: instance.$action([parameters], [success], [error])

问题在于,与 $http 不同,$update 或任何资源方法不直接 return 承诺。他们 return 一个空引用。

请注意,$resource 在内部使用 $http,因此适用 $http 文档(关于回调):

A response status code between 200 and 299 is considered a success status and will result in the success callback being called. Note that if the response is a redirect, XMLHttpRequest will transparently follow it, meaning that the error callback will not be called for such responses.