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


96

Я делаю запросы к своему 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');
            });

Ответы:


180

вы можете передать обработчик ошибок в качестве второго параметра 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
});

2
В документации это больше похоже на то, что третий параметр - это обратный вызов ошибки. «Resource.action ([параметры], [успех], [ошибка])» docs.angularjs.org/api/ngResource.$resource
Марсель

4
есть ли способ определить обработчик ошибок по умолчанию, общий для всего использования этого ресурса (например, «ресурс не авторизован сервером»?
Николас Джанель

2
@NicolasJanel. Вы можете определить функцию, которая будет ее обрабатывать, а затем выполните Resource.query().$promise.then(function(data) {}, errorFunction). Вам все равно придется включать его в каждое место, где вы используете запрос, но, по крайней мере, вы не будете каждый раз переопределять его.
schillingt

@valkirilov Буду признателен, если вы примете это как ответ на этот вопрос
marco.eig

2
@Kaspar возвращаемое значение методов экземпляра, таких как myResource.$saveи myResource.$deleteявляется обещанием. Так что вы можете просто сделать myResource.$save().then(...).
Carl G

68

Вы можете определить обработчик ошибок на этапе создания ресурса, добавив 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модуля, подробнее о них вы можете прочитать в их документации .


1

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

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

а затем в моем контроллере «деталь», введенная в контроллер, либо разрешит данные (хорошо), либо false для ошибки, где я обрабатываю отображение 404.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.