AngularJS में $ संसाधन सेवा त्रुटियों को कैसे संभालें


96

मैं अपने API के लिए अनुरोध कर रहा हूं और मैं AngularJS $ संसाधन मॉड्यूल का उपयोग कर रहा हूं। यह $ 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');
            });

जवाबों:


180

आप त्रुटि हैंडलर को दूसरे पैरामीटर के रूप में पास कर सकते हैं 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
दस्तावेज़ीकरण में यह अधिक दिखता है कि तीसरा पैरामीटर त्रुटि कॉलबैक है। "Resource.act ([पैरामीटर]], [सफलता], [त्रुटि]]" docs.angularjs.org/api/ngResource.$resource
Marcel

4
क्या इस संसाधन के सभी उपयोग के लिए एक सामान्य त्रुटि हैंडलर को सामान्य रूप से परिभाषित करने का एक तरीका है (उदाहरण के लिए "सर्वर द्वारा अधिकृत संसाधन नहीं"
निकोलस जैनेल

2
@ एनकोलसजेनल आप एक फ़ंक्शन को परिभाषित कर सकते हैं जो इसे तब हैंडल करेगा Resource.query().$promise.then(function(data) {}, errorFunction)। आपको अभी भी इसे हर उस जगह को शामिल करना होगा जिसे आप क्वेरी का उपयोग करते हैं, लेकिन कम से कम आप इसे हर बार फिर से परिभाषित नहीं करेंगे।
स्किलिंग

@valkirilov यदि आप इसे इस प्रश्न के उत्तर के रूप में स्वीकार करते हैं तो मैं इसकी सराहना करूँगा
marco.eig

2
@ कास्पर जैसे इंस्टेंस तरीकों का रिटर्न वैल्यू myResource.$saveऔर myResource.$deleteवादा है। तो आप बस कर सकते हैं myResource.$save().then(...)
कार्ल जी

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एक फंक्शन है जिसे प्रत्येक एरर ऑन गेट या क्वेरी मेथड कहा जाता है। पूछे जाने वाली समस्या के लिए, प्राप्त विधि की एकमात्र आवश्यकता है। बेशक आप इसे किसी भी कार्रवाई के लिए लागू कर सकते हैं।

एक अन्य इंटरसेप्टर response सामान्य प्रतिक्रिया को पकड़ने के लिए $ संसाधन के लिए मौजूद है।

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

इंटरसेप्टर $httpमॉड्यूल का हिस्सा हैं , आप उनके डॉक्स में उनके बारे में आगे पढ़ सकते हैं


1

यहाँ मेरे ng.resource पर एक नया ES6 उदाहरण (मैं टाइपस्क्रिप्ट का उपयोग करता हूं) है

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

और फिर मेरे कंट्रोलर में, कंट्रोलर में इंजेक्ट किया गया 'डिटेल' या तो डेटा (अच्छा) या त्रुटि के लिए गलत होगा, जहाँ मैं 404 का डिस्प्ले संभालता हूँ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.