Отклонение, отложенное в функции $update углового ресурса $

В моем угловом приложении я обновляю задачу следующим образом

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, что все в порядке, верно?


person Jeanluca Scaljeri    schedule 13.07.2015    source источник


Ответы (1)


Обратные вызовы указываются как параметры функций $update(), например:

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

См. официальную документацию $resource:

Методы действия над объектом класса или объектом экземпляра могут быть вызваны со следующими параметрами:

  • Действия HTTP GET «класса»: Resource.action([параметры], [успех], [ошибка])
  • Действия «класса» без GET: Resource.action([параметры], postData, [успех], [ошибка])
  • Действия экземпляра без GET: instance.$action([параметры], [успех], [ошибка])

Дело в том, что в отличие от $http, $update или любых ресурсных методов не возвращают промис напрямую. Они возвращают пустую ссылку.

Обратите внимание, что $resource использует https://docs.angularjs.org/api/ng/service/$http для внутреннего использования, поэтому применяются документы $http ( относительно обратных вызовов):

Код состояния ответа от 200 до 299 считается состоянием успеха и приведет к вызову обратного вызова. Обратите внимание, что если ответ является перенаправлением, XMLHttpRequest будет прозрачно следовать за ним, а это означает, что обратный вызов ошибки не будет вызываться для таких ответов.

person Michael F.    schedule 13.07.2015
comment
Я попробовал ваше предложение здесь, и оно работает. Но в моем приложении все еще вызывается первый обратный вызов. В моем приложении это код состояния http 422, может быть, это связано с этим. Где в документах описано, как определяется, какой обратный вызов вызывается? Возможно ли, что вы можете определить свою собственную функцию $update? - person Jeanluca Scaljeri; 13.07.2015
comment
Я также нашел этот пост, в котором используется перехватчик для отклонения ответ ?! Это действительно необходимо для ответа 4XX? - person Jeanluca Scaljeri; 13.07.2015
comment
$resource использует $http, поэтому применяется документация $http: ›Код ответа от 200 до 299 считается успешным статусом и приводит к успешному обратному вызову. Следовательно, что-либо ›= 400 (не перенаправление) вызовет обратный вызов ошибки. Вам нужен только перехватчик, если вы хотите определить обратный вызов, который вызывается для всех ваших запросов. Перехватчик будет запущен до определения обратного вызова в вашем методе $resource. - person Michael F.; 13.07.2015
comment
Проблема другого поста, на который вы ссылались, заключалась в том, что перехватчик ошибок не отклонял обещание. Следовательно, перехватчик успешно выполнил запрос. Обратный вызов, определенный в методе $resource, который выполнялся впоследствии, обрабатывал запросы как успешные. - person Michael F.; 13.07.2015
comment
в порядке. Но по какой-то причине обратный вызов успеха запускается, когда ответ бэкэнда имеет код состояния 422 - person Jeanluca Scaljeri; 13.07.2015
comment
Я думаю, что нашел проблему (проверьте мой оригинальный пост). Так что я думаю, мне нужно проверить коды состояния и отклонить - person Jeanluca Scaljeri; 13.07.2015
comment
Последняя строка вашего перехватчика responseError действительно должна отклонить обещание: return $q.reject(response); В противном случае это означает, что перехватчик восстановился после ошибки, что не так. - person Michael F.; 13.07.2015