2011-02-07 17 views
6

पर एक JSONP त्रुटि को पकड़ना मैं एक URL (विभिन्न डोमेन) पर jQuery.getJSON() का उपयोग कर रहा हूं जो मौजूद नहीं हो सकता है। क्या "संसाधन लोड करने में विफल" त्रुटि को पकड़ने का कोई तरीका है? ऐसा लगता है कि इस कॉल की असीमित प्रकृति के कारण कोशिश/पकड़ काम नहीं करती है।एक क्रॉस-डोमेन अनुरोध

मैं jQuery.ajax() के "error:" का उपयोग नहीं कर सकता। ड्यूमेटेशन से:

नोट: इस हैंडलर को क्रॉस-डोमेन स्क्रिप्ट और JSONP अनुरोधों के लिए नहीं कहा जाता है।

+0

की पुष्टि करें: त्रुटि शायद * फेंक दिया * से प्रति नहीं है, लेकिन बस कंसोल (केवल जब तुम कंसोल खोलें) में प्रकट होता है। –

+2

मैं इसे देख रहा हूं जब क्रोम कंसोल खुला है, या अन्य ब्राउज़रों में समकक्ष है।डेवलपर टूल्स बंद होने के साथ, यह त्रुटि चुप है। यह आकार दे रहा है कि ए) इसे अवरुद्ध करने का कोई तरीका नहीं है और बी) मुझे इसके बारे में चिंता नहीं करनी चाहिए? –

उत्तर

-2

आस्थगित वस्तुओं (jQuery 1.5 में नया) वास्तव में कैसे आप देख रहे हैं ध्वनि:

jQuery.Deferred, संस्करण 1.5 में शुरू की, एक chainable उपयोगिता उद्देश्य यह है कि में एकाधिक कॉलबैक रजिस्टर कर सकते हैं है कॉलबैक कतार, कॉलबैक कतारों का आह्वान करें, और किसी भी सिंक्रोनस या असिंक्रोनस फ़ंक्शन की सफलता या विफलता स्थिति को रिले करें।

http://api.jquery.com/category/deferred-object/

संपादित करें:

निम्नलिखित कोड मेरे लिए ठीक काम करता है:

function jsonError(){ 
    $("#test").text("error"); 
} 

$.getJSON("json.php",function(data){ 
    $("#test").text(data.a); 
}).fail(jsonError); 

json.php इस तरह दिखता है:

print '{"a":"1"}'; 

त्रुटि फ़ंक्शन मेरे लिए आग लगती है यदि json.php का पथ गलत है या JSON विकृत है। उदाहरण के लिए:

print '{xxx"a":"1"}'; 
+2

काफी नहीं। एसिंक ऑपरेशंस के परिणाम सिंक्रनाइज़ करने के लिए डीफर्ड्रेड एक सामान्य तंत्र हैं। ओपीएस समस्या यह पता लगाने के साथ है कि कोई JSONP अनुरोध विफल रहता है या नहीं। –

+0

यह आशाजनक लग रहा था। मैं इससे अपरिचित हूं और यह गलत कर रहा हूं, लेकिन यह काम नहीं कर रहा है: $ .getJSON ("http://www.bogus.com/&callback=?") .fail (function() {}); –

+0

मैंने कुछ जवाब के साथ अपना जवाब अपडेट किया। –

11

आप दूरस्थ सेवा से लौट रहे एक सफल परिणाम के सबसे ज्यादा मामले देरी की एक विचार है, तो आप एक टाइमआउट तंत्र निर्धारित करने के लिए उपयोग कर सकते हैं यदि कोई त्रुटि हुई थी या नहीं।

var cbSuccess = false; 
$.ajax({ 
    url: 'http://example.com/.../service.php?callback=?', 
    type: 'get', 
    dataType: 'json', 
    success: function(data) { 
       cbSuccess = true; 
      } 
}); 
setTimeout(function(){ 
     if(!cbSuccess) { alert("failed"); } 
    }, 2000); // assuming 2sec is the max wait time for results 
+0

आपके उत्तर के लिए धन्यवाद। यह अभी भी "संसाधन लोड करने में विफल" त्रुटि फेंक देगा, जो कि मैं रोकने की कोशिश कर रहा हूं। –

+2

+1 एक टाइमआउट जाने का एकमात्र तरीका है (2011 की शुरुआत में)। –

+4

@ मैथ्यू सिमोनौ: वह त्रुटि * लॉग * हो जाती है, नहीं * फेंक दी गई *। आप उस त्रुटि को कंसोल में लॉग इन होने से नहीं रोक सकते हैं। –

-6

क्लाइंट-साइड त्रुटि के बारे में आपकी शिकायत क्या है कि आपने सर्वर से संसाधन डाउनलोड करने का प्रयास किया है।

यह ब्राउज़र में बनाया गया है और यह आपके ब्राउज़र को क्लाइंट या डेवलपर्स को यह बताने की अनुमति देता है कि इंटरनेट से संसाधन डाउनलोड करना विफल रहा। इसका जावास्क्रिप्ट से कोई लेना-देना नहीं है और ब्राउजर द्वारा पकड़े गए HTTP पर फेंकने वाली एक और निम्न स्तर की त्रुटि है।

यदि आप इसे पकड़ने की कोई उम्मीद चाहते हैं तो आपको तीसरे पक्ष के एजेक्स पुस्तकालयों को छोड़ने और XMLHTTPRequest ऑब्जेक्ट के साथ बहुत कम स्तर पर निपटने की आवश्यकता होगी, फिर भी मुझे संदेह है कि आप इसके बारे में कुछ भी कर सकते हैं।

मूल रूप से जब आप यह त्रुटि देखते हैं तो पता लगाएं कि यह प्राप्त करने का आपका उद्देश्य कौन सा ऑब्जेक्ट मौजूद नहीं है या इसका उपयोग नहीं किया जा सका। फिर या तो इसे एक्सेस करना बंद करें या इसे सुलभ बनाएं।

+5

पहले दो पैराग्राफ महान हैं। तीसरा पूरी तरह से गलत है। जेएसओएनपी एक अलग जानवर है। लेकिन नियमित .ajax सामान के साथ, आप XMLHTTPRequest के साथ सीधे गड़बड़ करने से त्रुटियों को संभालने के लिए स्थगित ऑब्जेक्ट का उपयोग कर सकते हैं। –

+0

@rpflo meh XMLHttpRequest '.ajax' और deferreds के बाद अधिक सुरुचिपूर्ण है। हालांकि मुझे एक उदाहरण दिखाएं जहां आप jQuery का उपयोग करके इस "त्रुटि" को पकड़ सकते हैं। – Raynos

1

यह काम करता है:

j.ajaxSetup({ 
    "error":function(xhr, ajaxOptions, thrownError) { 

    console.log(thrownError);       
}}); 
+1

क्या आप निश्चित हैं? क्रॉस-डोमेन/JSONP कॉल XHR का उपयोग नहीं करते हैं, वे स्क्रिप्ट इंजेक्शन का उपयोग करते हैं। (कम से कम इस मामले में जहां सीओआरएस पर विचार नहीं किया जाता है।) – hippietrail

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