如何在 AngularJS 中处理 $resource 服务错误

我使用 AngularJS $资源模块对我的 API 发出请求。它与 $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);
});
...

I want something like this or .. I don't know a way to handle errors if my API is not working..

Category.query().success(function() {
console.log('success');
}).error(function() {
console.log('error');
});
85499 次浏览

you can pass the error handler as a second parameter toquery.

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

EDIT:

to make things a bit clearer, some examples:

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

You can define a error handler at the creation step of the resource by adding an interceptor object in the description of a method, with a responseError property, linked to your error function.

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

where resourceErrorHandler is a function called on each error on get or query method. For the problem asked, the get method is the only needed. Of course you can apply that to any action.

An other interceptor response exists for $resource to catch a normal response.

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

Interceptors are part of the $http module, you can further read about them in their docs.

Here is a new ES6 example (I use TypeScript) on my ng.resource

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

and then in my controller, 'detail' injected into the controller will either resolve to the data (good) or false for error, where I handle the display of 404.