Як обробляти помилки служби ресурсів $ у 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
У документації більше схоже на те, що 3-й параметр - це зворотний виклик помилки. "Resource.action ([параметри], [успіх], [помилка]]" docs.angularjs.org/api/ngResource.$resource
Марсель

4
чи є спосіб визначити обробник помилок за замовчуванням, загальний для всіх користувачів цього ресурсу (наприклад, "ресурс не авторизований сервером"?
Ніколас Джанел

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

@valkirilov Буду вдячний, якщо ви приймете це як відповідь на це запитання
marco.eig

2
@Kaspar повертається значення таких методів, як myResource.$saveі myResource.$deleteє обіцянкою. Тож ви можете просто зробити myResource.$save().then(...).
Карл Г

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для $ ресурсу, щоб вловити нормальну відповідь.

 {'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 );
    }
}

і тоді в моєму контролері "деталь", що вводиться в контролер, буде вирішуватися в даних (добре) або помилково для помилки, де я обробляю дисплей 404.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.