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');
            });
valkirilov.dll
sumber

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
});
marco.eig
sumber
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 .

Nicolas Janel
sumber
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.

httpete
sumber