Cách xử lý lỗi dịch vụ tài nguyên $ trong AngularJS


96

Tôi đang thực hiện các yêu cầu đối với API của mình và tôi đang sử dụng mô-đun tài nguyên AngularJS $. Nó khác với $ http nên tôi không biết cách xử lý lỗi của mình.

Dịch vụ của tôi:

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,

            }
        });
    }]);

Bộ điều khiển của tôi:

...
Category.query(function(data) {
                console.log(data);
            });
...

Tôi muốn một cái gì đó như thế này hoặc .. Tôi không biết cách xử lý lỗi nếu API của tôi không hoạt động ..

Category.query().success(function() {
                console.log('success');
            }).error(function() {
                console.log('error');
            });

Câu trả lời:


179

bạn có thể chuyển trình xử lý lỗi dưới dạng tham số thứ hai tới query.

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

BIÊN TẬP:

để làm cho mọi thứ rõ ràng hơn một chút, một số ví dụ:

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
Trong tài liệu, có vẻ như tham số thứ 3 là lỗi gọi lại. "Resource.action ([thông số], [thành công], [lỗi])" docs.angularjs.org/api/ngResource.$resource
Marcel

4
có cách nào để xác định một lỗi mặc định xử lý chung cho tất cả sử dụng các tài nguyên này (ví dụ "tài nguyên không được phép của máy chủ"?
Nicolas Janel

2
@NicolasJanel Bạn có thể xác định một hàm sẽ xử lý nó sau đó thực hiện Resource.query().$promise.then(function(data) {}, errorFunction). Bạn sẽ vẫn phải bao gồm nó ở mọi nơi bạn sử dụng truy vấn, nhưng ít nhất bạn sẽ không phải xác định lại nó mỗi lần.
schillingt

@valkirilov Tôi đánh giá cao nó nếu bạn chấp nhận điều này là câu trả lời cho câu hỏi này
marco.eig

2
@Kaspar giá trị trả về của các phương thức thể hiện như myResource.$savemyResource.$deletelà lời hứa. Vì vậy, bạn chỉ có thể làm myResource.$save().then(...).
Carl G,

68

Bạn có thể xác định một trình xử lý lỗi ở bước tạo tài nguyên bằng cách thêm một interceptorđối tượng trong mô tả của một phương thức, với một thuộc responseErrortính, được liên kết với hàm lỗi của bạn.

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

đâu resourceErrorHandlerlà một hàm được gọi trên mỗi lỗi trên phương thức get hoặc query. Đối với vấn đề được hỏi, phương thức get là cần thiết duy nhất. Tất nhiên bạn có thể áp dụng điều đó cho bất kỳ hành động nào.

Một bộ chặn khác responsetồn tại cho $ resource để bắt một phản hồi bình thường.

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

Các thiết bị đánh chặn là một phần của $httpmô-đun, bạn có thể đọc thêm về chúng trong tài liệu của họ .


1

Đây là một ví dụ ES6 mới (tôi sử dụng TypeScript) trên ng.resource của tôi

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

và sau đó trong bộ điều khiển của tôi, 'chi tiết' được đưa vào bộ điều khiển sẽ giải quyết dữ liệu (tốt) hoặc sai đối với lỗi, nơi tôi xử lý hiển thị của 404.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.