2012-02-27 16 views
15

लागू किया गया है, तो मैं अपनी बैक एंड सेवा से कनेक्ट करने के लिए jQuery.ajax() का उपयोग कर रहा हूं। मैंने एक त्रुटि() हैंडलर और एक स्टेटस कोड() हैंडलर कॉन्फ़िगर किया है। वे दोनों ठीक काम करते हैं, लेकिन जब मेरी स्थिति कोड हैंडलर को निकाल दिया जाता है तो त्रुटि हैंडलर भी आग लगती है (त्रुटि हैंडलर वास्तव में पहले निकाल दिया जाता है)। मैं ऐसा नहीं करना चाहूंगा। मुझे लगता है कि त्रुटि हैंडलर कोड हैक किए बिना यह संभव है?jQuery AJAX - त्रुटि से बचें() कॉलबैक जब स्थिति कोड() कॉलबैक

मेरे कोड इस तरह दिखता है:

$.ajax({ 
    ... 
    error: function(...) { 
     // process a general type of error here 
    }, 
    statusCode: { 
     401: function() { 
      // process a specific authentication failure 
     } 
    }     
}); 

तो कैसे मैं त्रुटि() हैंडलर गोलीबारी से बच सकते हैं जब HTTP स्थिति कोड 401 है?

पढ़ने के लिए परेशान करने के लिए धन्यवाद!

+2

मुझे आश्चर्य है कि अगर यह jQuery टीम का अनुरोध लायक हो सकता है, यह बहुत बनाने के लिए जब आप 'statusCode' संचालकों में झूठी यह अप करने के लिए प्रचार ajax घटना को रोका जा सकेगा वापसी 'त्रुटि' हैंडलर। निश्चित रूप से इसे अधिक प्रयास की आवश्यकता नहीं होगी, जबकि एक एप्लिकेशन लिखना आसान हो जाता है जहां अनधिकृत अनुरोधों में सभी एक ही वैश्विक हैंडलर होते हैं, यानी: उपयोगकर्ता को लॉगिन स्क्रीन पर वापस करने के लिए एक फ़ंक्शन। –

+0

@ जोशएमसी: अच्छा विचार! – David

उत्तर

6

jQuery.ajax हैकिंग के बिना, आप नहीं कर सकते। मेरे लिए, jQuery की AJAX विधियां लाइब्रेरी के दुखद बिंदुओं में से एक है। अधिक समझदार अनुरोध हैंडलिंग के लिए, मैं आपको superagent या कुछ अन्य स्टैंड-अलोन लाइब्रेरी में देखने की सलाह देता हूं।

+0

हालांकि वास्तव में मैं जो सुनना नहीं चाहता था, मुझे लगता है कि मैं इसे करीब के रूप में देख सकता हूं। धन्यवाद। –

0

चेक आउट त्रुटि विधि के साथ स्थिति कोड से निपटने के बारे इस पोस्ट में जवाब: how to get jquery ajax status code

+0

'त्रुटि()' विफल() 'को कॉल करने से नहीं रोकता है। – Francisc

10

आप आसानी से त्रुटि कॉलबैक के अंदर स्थिति कोड की जांच कर सकते हैं। पहला पैरामीटर XMLHttpRequest (या jqHXR jQuery के आपके संस्करण पर प्रदर्शित होना चाहिए) ऑब्जेक्ट होना चाहिए। तदनुसार त्रुटि संभाल के स्थिति कोड के लिए 'स्थिति' गुण देखें।

उदा।

error: function(a, b, c){ 
    if(a.status != 401){ 
    // handle other errors except authentication 

    } 
} 
+0

हां, लेकिन मैं मूल पोस्ट में उल्लेखित त्रुटि हैंडलर को हैक करने से बचने की उम्मीद कर रहा था। जो मैं समझता हूं उससे यह नहीं किया जा सकता है जो मुझे थोड़ा अजीब के रूप में मारता है ... –

+0

@LeeFrancis, ओह, मैं देखता हूं कि आपका क्या मतलब है। क्या आप सिर्फ एक रैपर नहीं लिख सकते जो $ .ajax कॉल का उपयोग करता है। फिर आप त्रुटि हैंडलर में कौन से स्टेटस कोड को दबाना चाहते हैं निर्दिष्ट कर सकते हैं?मैं अपने सभी AJAX कॉल के लिए लेखक रैपर, इसलिए मैं एक ही स्थान पर किसी भी tweaking कर सकते हैं। बस एक विचार ... –

+0

हां, यह अंत में क्या कर रहा है जो कम या ज्यादा है। हालांकि, मुझे लगता है कि जब भी आप स्टेटस कोड मैन्युअल रूप से देख रहे हों, तो लाइब्रेरी प्री-डिफ़ाइंड हैंडलर उपलब्ध (सफलता इत्यादि) रखने के उद्देश्य को हरा रहा हूं। –

2

आप अपने आप अपने ajax अनुरोध की त्रुटि हैंडलर बदलाव करने ajaxSetup और beforeSend उपयोग करने का प्रयास कर सकते हैं:

$.ajaxSetup({ 
    beforeSend: function(jqXHR, settings) { 
    if (typeof settings.error === 'function') { 
     var errorfunc = settings.error; 
     settings.error = function(jqXHR2, textStatus, errorThrown) { 
     if (jqXHR2.status !== 401) errorfunc(jqXHR2, textStatus, errorThrown); 
     }; 
    } 
    } 
}); 

मेरे मामले इस काम करता है।

+0

बहुत अच्छा। हालांकि, क्या यह काम करने के लिए किया जा सकता है जब त्रुटि हैंडलर '$ .ajax' द्वारा लौटाए गए स्थगित पर' विफल() 'के साथ सेट किया गया है? – Francisc

+0

मैंने कोशिश नहीं की है, लेकिन jQuery jqXHR ऑब्जेक्ट के कॉलबैक निष्पादन आदेश के अनुसार (असफल होने से पहले त्रुटि, http://api.jquery.com/jQuery.ajax/ देखें) आप शायद फ़ंक्शन के भीतर स्थगित कॉलबैक को संशोधित कर सकते हैं मूल सेटिंग्स को बदलना। आतंक। – user2043553

5

पिछले वर्कअराउंड्स में सुधार करना जिसके लिए स्टेटस कोड हार्ड कोडिंग की आवश्यकता होती है जिसके लिए आप जेनेरिक इवेंट हैंडलर को आग नहीं करना चाहते हैं।

मेरी राय में पहले से ही अपने त्रुटि हैंडलर को संपादित करना सुरक्षित है क्योंकि कुछ अन्य उद्देश्यों के लिए ओवरराइट हो सकता है और इसलिए आप अनजाने में उन कॉल पर जेनेरिक त्रुटि हैंडलर को आग लग सकते हैं। (अगर कोई त्रुटि कॉलबैक को ओवरराइट करता है तो वे उम्मीद करते हैं कि यह त्रुटि हैंडलिंग को प्रभावित करेगा, अगर वे पहले से कॉल कॉलबैक को संशोधित करते हैं तो वे नहीं करते हैं)।

तो तुम मिलेगा:

function ajaxError (jqXHR, textStatus, errorThrown) 
{ 
    if (jqXHR.status in this.statusCode) return; 
    // Handle generic events here. 

} 
+0

यह बहुत चालाक है। – Francisc

संबंधित मुद्दे