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

时间:2013-12-14 14:17:13

标签: angularjs angular-resource

我正在向我的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');
            });

3 个答案:

答案 0 :(得分:178)

您可以将错误处理程序作为第二个参数传递给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
});

答案 1 :(得分: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方法是唯一需要的。当然,您可以将其应用于任何行动。

$ resource存在另一个拦截器response以捕获正常响应。

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

拦截器是$http模块的一部分,您可以进一步read about them in their docs

答案 2 :(得分:1)

这是我的ng.resource

上新的ES6示例(我使用TypeScript)
resolve: {
    detail: function (myService, $stateParams) {
        return myService.getEventDetail({ id: $stateParams.id }).$promise.then(data => data, error => false );
    }
}

然后在我的控制器中,'详细信息'注入控制器将解析数据(好)或错误错误,我处理404的显示。