Bagaimana menangani error $ resource service di AngularJS


96

Saya membuat permintaan ke API saya dan saya menggunakan modul sumber daya AngularJS $. Ini berbeda dari $ http jadi saya tidak tahu bagaimana menangani kesalahan saya.

Layanan saya:

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,

            }
        });
    }]);

Pengontrol Saya:

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

Saya menginginkan sesuatu seperti ini atau .. Saya tidak tahu cara menangani kesalahan jika API saya tidak berfungsi ..

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

Jawaban:


180

Anda dapat meneruskan penangan kesalahan sebagai parameter kedua ke query.

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

EDIT:

untuk membuatnya lebih jelas, beberapa contoh:

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
Dalam dokumentasi, sepertinya parameter ke-3 adalah error callback. "Resource.action ([parameter], [sukses], [error])" docs.angularjs.org/api/ngResource.$resource
Marcel

4
apakah ada cara untuk menentukan penangan kesalahan default yang umum untuk semua penggunaan sumber daya ini (mis. "sumber daya tidak diotorisasi oleh server"?
Nicolas Janel

2
@NicolasJanel Anda bisa mendefinisikan fungsi yang akan menanganinya kemudian lakukan Resource.query().$promise.then(function(data) {}, errorFunction). Anda masih harus memasukkannya di setiap tempat Anda menggunakan kueri, tetapi setidaknya Anda tidak akan mendefinisikannya kembali setiap kali.
schillingt

@valkirilov Saya akan menghargai jika Anda menerima ini sebagai jawaban untuk pertanyaan ini
marco.eig

2
@Kaspar nilai kembalian dari metode instance seperti myResource.$saveand myResource.$deleteis the promise. Jadi Anda bisa melakukannya myResource.$save().then(...).
Carl G

68

Anda bisa mendefinisikan penangan kesalahan pada langkah pembuatan sumber daya dengan menambahkan interceptorobjek dalam deskripsi metode, dengan responseErrorproperti, yang ditautkan ke fungsi kesalahan Anda.

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

di mana resourceErrorHandlerfungsi dipanggil pada setiap kesalahan pada metode get atau query. Untuk masalah yang ditanyakan, metode get adalah satu-satunya yang diperlukan. Tentu saja Anda dapat menerapkannya pada tindakan apa pun.

Ada pencegat lain responseuntuk $ resource guna menangkap respons normal.

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

Interceptor adalah bagian dari $httpmodul, Anda dapat membaca lebih lanjut tentang mereka di dokumen mereka .


1

Berikut adalah contoh ES6 baru (saya menggunakan TypeScript) di ng.resource saya

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

dan kemudian di pengontrol saya, 'detail' yang disuntikkan ke pengontrol akan menyelesaikan ke data (baik) atau salah untuk kesalahan, di mana saya menangani tampilan 404.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.