2012-03-08 17 views
12

मैं jQuery पर पास किए गए कॉलबैक से फेंकने वाले अपवादों को पकड़ना चाहता हूं (या तो click जैसे ईवेंट हैंडलर या then या always जैसे jqXHR विधियों के लिए)।jQuery को पास किए गए कॉलबैक में फेंकने वाले अपवादों को कैसे पकड़ें?

मैं दो विकल्प की पहचान की है:

  • window.onerror हैंडलर - यह केवल एक आंशिक समाधान है क्योंकि यह एंड्रॉयड पर समर्थित नहीं है जो मेरे लक्ष्य प्लेटफार्मों में से एक है
  • प्रत्येक व्यक्ति कॉलबैक के भीतर से निपटने अपवाद है - बिल्कुल DRY नहीं!

एकमात्र अन्य चीज जो मैं सोच सकता हूं वह jQuery विधियों को ओवरराइड कर रहा है लेकिन जब भी मैं jQuery को अपग्रेड करता हूं तो समस्याएं हो सकती हैं। AJAX हैंडलर के लिए, मैं संभवतः $ .ajaxSetup का उपयोग कर सकता हूं (Exceptions thrown in jQuery AJAX callbacks swallowed? के उत्तर के अनुसार) लेकिन मुझे यकीन नहीं है कि मुझे सबकुछ पकड़ने की अनुमति मिलेगी।

क्या कोई अन्य विकल्प हैं?

function cbWrapper(fn) { 
    return function() { 
     try { 
      return(fn.apply(this, arguments)); 
     } catch(e) { 
      // handle all your exceptions here 
     } 
    }; 
} 

इसलिए, जब आप के बजाय वास्तविक कॉलबैक पास करने का, एक अजाक्स कॉल करने के लिए एक कॉलबैक पारित करने के लिए जाते हैं, आप cbWrapper(callback) पारित:

उत्तर

15

इस तरह से प्रत्येक कॉलबैक लपेट कर सकते हैं।

$.get(url, cbWrapper(myRealCallback)); 

या इनलाइन गुमनाम संस्करण इस तरह होगा:

$.get(url, cbWrapper(function() { 
    // actual callback code here 
})); 

कर इसे अपने कार्यान्वयन कि कॉलबैक स्वचालित रूप से लपेटता साथ $.get() ओवरराइड करने के लिए किया जाएगा की एक और अधिक उन्नत तरीका है, लेकिन यह मुश्किल हो जाता है क्योंकि jQuery वास्तव में क्या तर्क पारित कर रहे हैं के बारे में इतना लचीला है। इसके कारण और क्योंकि आपको यह काम करने के लिए एक विशिष्ट तर्क को ओवरराइड करना होगा, आपको अपने सभी तर्क पहचान कोड को डुप्लिकेट करना होगा जो बताता है कि कौन से तर्क मौजूद हैं और कौन सा वास्तविक फ़ंक्शन पैरामीटर से मेल खाता है। वह कोड थोड़ा गन्दा है। यह करने योग्य है और शायद तोड़ नहीं होगा क्योंकि अगर jQuery ने इसे तोड़ दिया, तो मौजूदा jQuery कोड तोड़ देगा, लेकिन यह बहुत साफ नहीं है।

यदि यह सब अपने खुद के कोड है, तो आप सिर्फ इतना है कि तर्क पदों के साथ इतना लचीला नहीं है $.get() के अपने स्वयं के संस्करण बनाने के लिए और अपने कोड के सभी वास्तविक $.get() के बजाय इसका उपयोग करने के लिए स्विच कर सकते हैं:

jQuery.fn.myGet = function(url, fn) { 
    return(jQuery.get(url, cbWrapper(fn))); 
} 
संबंधित मुद्दे