AngularJS'de $ kaynak hizmeti hataları nasıl ele alınır


96

API'me istekler yapıyorum ve AngularJS $ kaynak modülünü kullanıyorum. $ Http’den farklı olduğu için hatalarımı nasıl ele alacağımı bilmiyorum.

Benim hizmetim:

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,

            }
        });
    }]);

Denetleyicim:

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

Bunun gibi bir şey istiyorum veya .. API'm çalışmıyorsa hataları ele almanın bir yolunu bilmiyorum ..

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

Yanıtlar:


180

hata işleyiciyi ikinci parametre olarak 'a iletebilirsiniz query.

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

DÜZENLE:

işleri biraz daha netleştirmek için bazı örnekler:

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
Dokümantasyonda 3. parametrenin hata geri çağrısı olduğu görülüyor. "Resource.action ([parametreler], [başarılı], [hata])" docs.angularjs.org/api/ngResource.$resource
Marcel

4
Bu kaynağın tüm kullanımlarında ortak olan varsayılan bir hata işleyicisini tanımlamanın bir yolu var mı (ör. "kaynak sunucu tarafından yetkilendirilmemiş"?
Nicolas Janel

2
@NicolasJanel Daha sonra işleyecek bir işlev tanımlayabilirsiniz Resource.query().$promise.then(function(data) {}, errorFunction). Yine de bir sorgu kullandığınız her yere eklemeniz gerekecek, ancak en azından her seferinde yeniden tanımlamayacaksınız.
schillingt

@valkirilov Bunu bu sorunun cevabı olarak kabul ederseniz çok sevinirim
marco.eig

2
@Kaspar gibi örnek yöntemlerin dönüş değeri myResource.$saveve myResource.$deletesözdür. Yani yapabilirsin myResource.$save().then(...).
Carl G

68

interceptorBir yöntemin açıklamasına, responseErrorhata işlevinize bağlı bir özelliğe sahip bir nesne ekleyerek, kaynağın oluşturma adımında bir hata işleyicisi tanımlayabilirsiniz .

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

resourceErrorHandlerget veya query yöntemindeki her hatada çağrılan bir işlev nerede . Sorulan sorun için, gereken tek şey get yöntemidir. Elbette bunu herhangi bir eyleme uygulayabilirsiniz.

response$ Resource'un normal bir yanıt yakalaması için başka bir yakalayıcı daha var.

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

Durdurucular $httpmodülün bir parçasıdır, onlar hakkında daha fazla bilgiyi belgelerinde okuyabilirsiniz .


1

Ng.resource'umda yeni bir ES6 örneği (TypeScript kullanıyorum)

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

ve sonra denetleyicimde, denetleyiciye yerleştirilen 'ayrıntı', veriye (iyi) veya hata için yanlış olarak çözülür, burada 404'ün görüntüsünü idare ederim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.