如何处理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'); }); 

您可以将error handling程序作为第二个参数进行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 }); 

您可以在资源的创build步骤中定义一个error handling程序,方法是在方法描述中添加一个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模块的一部分,你可以在他们的文档中进一步阅读它们 。

这是一个新的ES6的例子(我使用TypeScript)在我的ng.resource

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

然后在我的控制器中,注入到控制器中的“细节”将parsing为数据(好)或错误,我处理404的显示。