Как обрабатывать ошибки сервиса $resource в AngularJS

Я делаю запросы к своему API и использую модуль ресурсов AngularJS $. Это отличается от $http, поэтому я не знаю, как обрабатывать свои ошибки.

Мой сервис:

var appServices = angular.module('app.services', ['ngResource']);
appServices.factory('Category', ['$resource',
    function($resource){
        return $resource('/apicategoryerr/?format=:format', {}, {
            query: {
                method: 'GET', 
                params: { format: 'json'}, 
                isArray: true,

            }
        });
    }]);

Мой контроллер:

...
Category.query(function(data) {
                console.log(data);
            });
...

Я хочу что-то вроде этого или.. Я не знаю способ обработки ошибок, если мой API не работает..

Category.query().success(function() {
                console.log('success');
            }).error(function() {
                console.log('error');
            });

3 ответа

Решение

Вы можете передать обработчик ошибок в качестве второго параметраquery,

Category.query(function(data) {}, function() {});

РЕДАКТИРОВАТЬ:

Чтобы прояснить ситуацию, приведем несколько примеров:

var Resource = $resource('/restapi/resource');

Resource.query(function(data) {
    // success handler
}, function(error) {
    // error handler
});

Resource.query({
    'query': 'thequery'
},function(data) {
    // success handler
}, function(error) {
    // error handler
});

Resource.query().$promise.then(function(data) {
    // success handler
}, function(error) {
    // error handler
});

Resource.query({
    'query': 'thequery'
}).$promise.then(function(data) {
    // success handler
}, function(error) {
    // error handler
});

Вы можете определить обработчик ошибок на этапе создания ресурса, добавив interceptor объект в описании метода, с responseError свойство, связанное с вашей функцией ошибки.

function resourceErrorHandler(response) { ... }

$resource('/path/:param/', {} , 
{
        'get':    {method:'GET', 
                   interceptor : {responseError : resourceErrorHandler}},
        'save':   {method:'POST'},
        'query':  {method:'GET', isArray:true, 
                   interceptor : {responseError : resourceErrorHandler}},
        'remove': {method:'DELETE'},
        'delete': {method:'DELETE'}
};

где resourceErrorHandler является функцией, вызываемой при каждой ошибке в методе get или query Для поставленной задачи метод get является единственным необходимым. Конечно, вы можете применить это к любому действию.

Другой перехватчик response существует для $ resource, чтобы поймать нормальный ответ.

 {'get': {method:'GET', interceptor : {response : resourceResponseHandler}},

Перехватчики являются частью $http Модуль, вы можете прочитать о них в их документации.

Вот новый пример ES6 (я использую TypeScript) на моем ng.resource

resolve: {
    detail: function (myService, $stateParams) {
        return myService.getEventDetail({ id: $stateParams.id }).$promise.then(data => data, error => false );
    }
}

и затем в моем контроллере "деталь", введенная в контроллер, преобразуется либо в данные (хорошие), либо в ложь для ошибки, где я обрабатываю отображение 404.

Другие вопросы по тегам