Как обрабатывать ошибки службы ресурсов в 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');
});
Ответы
Ответ 1
вы можете передать обработчик ошибок в качестве второго параметра в query
.
Category.query(function(data) {}, function() {});
EDIT:
чтобы сделать вещи более ясными, некоторые примеры:
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
Вы можете определить обработчик ошибок на шаге создания ресурса, добавив объект 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 является единственным необходимым. Конечно, вы можете применить это к любому действию.
Для $resource существует другой перехватчик response
, чтобы поймать нормальный ответ.
{'get': {method:'GET', interceptor : {response : resourceResponseHandler}},
Перехватчики являются частью модуля $http
, вы можете читать о них в своих документах.
Ответ 3
Вот пример ES6 (я использую TypeScript) на моем ng.resource
resolve: {
detail: function (myService, $stateParams) {
return myService.getEventDetail({ id: $stateParams.id }).$promise.then(data => data, error => false );
}
}
а затем в моем контроллере "деталь", введенная в контроллер, либо решит данные (хорошие), либо false для ошибки, где я обрабатываю отображение 404.