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


96

我正在向我的API发出请求,并且正在使用AngularJS $ resource模块。它与$ 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');
            });

Answers:


179

您可以将错误处理程序作为第二个参数传递给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([parameters],[success],[error])”” docs.angularjs.org/api/ngResource.$resource
Marcel

4
有没有一种方法可以定义一个默认错误处理程序,该错误处理程序对该资源的所有使用(例如“未经服务器授权的资源”)都通用?
Nicolas Janel 2014年

2
@NicolasJanel您可以定义一个函数,然后处理该函数Resource.query().$promise.then(function(data) {}, errorFunction)。您仍然必须在使用查询的每个位置都包含它,但至少不会每次都重新定义它。
schillingt 2014年

@valkirilov,如果您接受它作为此问题的答案,我将不胜感激
marco.eig 2014年

2
@Kaspar是实例方法(例如myResource.$savemyResource.$delete)的返回值。所以你可以做myResource.$save().then(...)
卡尔·G

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存在另一个用于$ resource的拦截器,以捕获正常响应。

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

拦截器是$http模块的一部分,您可以在其docs中进一步了解它们


1

这是我的ng.resource上的新ES6示例(我使用TypeScript)

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

然后在我的控制器中,注入到控制器中的“详细信息”将解析为数据(好),或者为错误(如果出错),在这里我处理404的显示。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.