jQuery AJAX (jsonp) एक टाइमआउट को अनदेखा करता है और त्रुटि ईवेंट को आग नहीं करता है



2 Answers

यह jQuery में देशी jsonp कार्यान्वयन के साथ एक ज्ञात सीमा है। नीचे दिया गया पाठ आईबीएम डेवलपर वर्क्स से है

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

हालांकि GoogleCode पर एक GoogleCode प्लग-इन उपलब्ध है जो त्रुटि प्रबंधन के लिए समर्थन प्रदान करता है। प्रारंभ करने के लिए, बस अपने कोड में निम्नलिखित परिवर्तन करें।

आप या तो इसे डाउनलोड कर सकते हैं, या प्लग-इन में केवल एक स्क्रिप्ट संदर्भ जोड़ सकते हैं।

<script type="text/javascript" 
     src="http://jquery-jsonp.googlecode.com/files/jquery.jsonp-1.0.4.min.js">
</script>

फिर नीचे दिखाए गए अनुसार अपने AJAX कॉल को संशोधित करें:

$(function(){
    //var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne"; // correct URL
    var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne_______"; // this should throw a 404  
    $.jsonp({
        url: jsonFeed,
        data: { "lang" : "en-us",
                "format" : "json",
                "tags" : "sunset"
        },
        dataType: "jsonp",
        callbackParameter: "jsoncallback",
        timeout: 5000,
        success: function(data, status){
            $.each(data.items, function(i,item){
                $("<img>").attr("src", (item.media.m).replace("_m.","_s."))
                          .attr("alt", item.title)
                          .appendTo("ul#flickr")
                          .wrap("<li><a href=\"" + item.link + "\"></a></li>");
                if (i == 9) return false;
            });
        },
        error: function(XHR, textStatus, errorThrown){
            alert("ERREUR: " + textStatus);
            alert("ERREUR: " + errorThrown);
        }
    });
});
Question

कुछ बुनियादी त्रुटि हैंडलिंग जोड़ने के लिए, मैं फ्लिकर से कुछ तस्वीरों को खींचने के लिए jQuery के $ .getJSON का उपयोग करने वाले कोड के एक टुकड़े को फिर से लिखना चाहता था। ऐसा करने का कारण यह है कि $ .getJSON त्रुटि प्रबंधन या टाइमआउट के साथ काम नहीं करता है।

$ .getJSON $ के आसपास सिर्फ एक रैपर है। अजाक्स मैंने इस बात को फिर से लिखने और आश्चर्यचकित करने का फैसला किया, यह बेकार ढंग से काम करता है।

अब मज़ा शुरू होता है। जब मैं जानबूझकर 404 (यूआरएल को बदलकर) का कारण बनता हूं या नेटवर्क को टाइमआउट (इंटरवब्स तक नहीं लगाया जाता) का कारण बनता है, तो त्रुटि घटना बिल्कुल भी नहीं होती है। मैं एक नुकसान में हूं कि मैं क्या गलत कर रहा हूं। सहायता बहुत सराहना की है।

यहां कोड है:

$(document).ready(function(){

    // var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne"; // correct URL
    var jsonFeed = "http://api.flickr.com/services/feeds/photos_public.gne_______"; // this should throw a 404

    $.ajax({
        url: jsonFeed,
        data: { "lang" : "en-us",
                "format" : "json",
                "tags" : "sunset"
        },
        dataType: "jsonp",
        jsonp: "jsoncallback",
        timeout: 5000,
        success: function(data, status){
            $.each(data.items, function(i,item){
                $("<img>").attr("src", (item.media.m).replace("_m.","_s."))
                          .attr("alt", item.title)
                          .appendTo("ul#flickr")
                          .wrap("<li><a href=\"" + item.link + "\"></a></li>");
                if (i == 9) return false;
            });
        },
        error: function(XHR, textStatus, errorThrown){
            alert("ERREUR: " + textStatus);
            alert("ERREUR: " + errorThrown);
        }
    });

});

मैं यह जोड़ना चाहता हूं कि यह प्रश्न पूछा गया था कि jQuery संस्करण 1.4.2 पर था




यह jQuery की एक "ज्ञात" सीमा हो सकती है; हालांकि, यह अच्छी तरह से प्रलेखित प्रतीत नहीं होता है। मैंने आज समझने की कोशिश में लगभग 4 घंटे बिताए कि मेरा टाइमआउट क्यों काम नहीं कर रहा था।

मैंने GoogleCode स्विच किया और यह एक आकर्षण पसंद आया। धन्यवाद।




answer में उल्लिखित jquery-jsonp jQuery प्लगइन अब GitHub पर पाया जा सकता GitHub

दुर्भाग्यवश दस्तावेज कुछ हद तक स्पार्टन है, इसलिए मैंने एक साधारण उदाहरण प्रदान किया है:

    $.jsonp({
        cache: false,
        url: "url",
        callbackParameter: "callback",
        data: { "key" : "value" },
        success: function (json, textStatus, xOptions) {
            // handle success - textStatus is "success"   
        },
        error: function (xOptions, textStatus) {
            // handle failure - textStatus is either "error" or "timeout"
        }
    });

महत्वपूर्ण कॉलबैक पैरामीटर कॉल $ .jsonp () अन्यथा मुझे पता चला है कि कॉलबैक फ़ंक्शन कभी भी सेवा कॉल की क्वेरी स्ट्रिंग में इंजेक्शन नहीं मिलता है (jquery-jsonp के संस्करण 2.4.0 के रूप में वर्तमान)।

मुझे पता है कि यह सवाल पुराना है, लेकिन जेएसओएनपी का उपयोग कर त्रुटि प्रबंधन का मुद्दा अभी भी 'हल नहीं हुआ' है। उम्मीद है कि यह अद्यतन दूसरों की सहायता करेगा क्योंकि यह प्रश्न "jquery jsonp त्रुटि हैंडलिंग" के लिए Google के भीतर शीर्ष रैंकिंग है।




Related