GetJSON कॉल में हैंडलिंग में त्रुटि


192

गेटजोन कॉल में आप त्रुटियों को कैसे संभाल सकते हैं? Im jsonp का उपयोग करके एक क्रॉस-डोमेन स्क्रिप्ट सेवा का संदर्भ देने की कोशिश कर रहा है, आप एक त्रुटि विधि कैसे दर्ज करते हैं?



अजय, सही जवाब को चिह्नित करने पर विचार क्यों नहीं किया गया?
Ionică Bizău

@ IonicăBizău ने इसे अभी चिह्नित किया है। मैंने थोड़ी देर के लिए इस पर नज़र रखी। शीर्ष उत्तर JSONP के बारे में बात नहीं कर रहा है। जैसा कि बेन शेलॉक ने बताया, कोई भी समर्थित त्रुटि हैंडलर नहीं है जो मुझे विश्वास है ..
अजय

जवाबों:


277

$.getJSON() एक नियमित AJAX कॉल का एक प्रकार है जहां आपको यह बताना होगा कि आप JSON एन्कोडेड प्रतिक्रिया चाहते हैं।

$.ajax({
  url: url,
  dataType: 'json',
  data: data,
  success: callback
});

आप त्रुटियों को दो तरीकों से संभाल सकते हैं: मूल रूप से (वास्तव में उन्हें कॉल करने से पहले अपने AJAX कॉल को कॉन्फ़िगर करके) या विशेष रूप से (विधि श्रृंखला के साथ)।

'जेनेरिक' कुछ इस तरह होगा:

$.ajaxSetup({
      "error":function() { alert("error");  }
});

और 'विशिष्ट' तरीका:

$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })
.complete(function() { alert("complete"); });

Nops! आप जैसे चाहें वहां जा सकते हैं। अधिक विस्तृत मदद के लिए डॉक्स पर एक नज़र डालें: http://api.jquery.com/jQuery.ajax
लुसियानो कोस्टा

5
ध्यान दें कि इसके लिए jQuery 1.5+ की आवश्यकता होती है (यह काम करने की कोशिश कर रहा था w / jQuery 1.3 और सोच रहा था कि यह अवैध तरीके के बारे में शिकायत क्यों कर रहा था :-)
kenyee

24
ओपी विशेष रूप से क्रॉस-साइट के बारे में पूछ रहा है JSONP, ऐसा लगता है getJSONकि ऐसे मामले में error()फ़ंक्शन को कॉल नहीं किया जाता है। मुझे भी यही तकलीफ़ है। मुझे लगता है कि यह दोनों को संभालने के बावजूद JSONPसामान्य AJAXकॉल के लिए पूरी तरह से अलग कैसे नियंत्रित किया जाता है । एक वस्तु के साथ किया जाता है, लेकिन पृष्ठ के टैग को गतिशील रूप से जोड़कर किया जाता हैjQuerygetJSONJSONXMLHTTPRequestJSONP<script>HEAD
हिप्पिट्रैएल

3
JQuery Doc का कहना है "नोट: इस हैंडलर को क्रॉस-डोमेन स्क्रिप्ट और JSONP अनुरोधों के लिए नहीं कहा जाता है।" api.jquery.com/jQuery.ajax > त्रुटि
OneWorld

10
"JqXHR.success (), jqXHR.error (), और jqXHR.complete () कॉलबैक विधियों को jQuery 1.5 में प्रस्तुत किया गया है jQuery 1.8 के रूप में चित्रित किया गया है। अपने अंतिम निष्कासन के लिए अपना कोड तैयार करने के लिए, jqXHR.done (), jqXHR.done का उपयोग करें। .fail (), और jqXHR.always () के बजाय। "
स्कॉरुनका फ्रांटिसेक

86

कोई व्यक्ति लुसियानो को ये अंक देता है :) मैंने बस उसके उत्तर का परीक्षण किया-एक समान प्रश्न- और पूरी तरह से काम किया ...

मैं अपने 50 सेंट भी जोड़ता हूं:

.error(function(jqXHR, textStatus, errorThrown) {
        console.log("error " + textStatus);
        console.log("incoming Text " + jqXHR.responseText);
    })

3
क्या यह क्रॉस-साइट JSONP या उसी साइट JSON के साथ था?
हिप्पिट्रैएल

28
अच्छा उत्तर! .त्रुटि के बारे में बस एक नोट: यह, jQuery 1.8 में विरोध करेंगे, ताकि उपयोग .fail
अनातोली मिरोनोव

73

यहाँ मेरा जोड़ है।

से http://www.learnjavascript.co.uk/jq/reference/ajax/getjson.html और आधिकारिक स्रोत

" JqXHR.success (), jqXHR.error (), और jqXHR.complete () कॉलबैक विधियों को jQuery 1.5 में प्रस्तुत किया गया है jQuery 1.8 के रूप में चित्रित किया गया है। अपने अंतिम निष्कासन के लिए अपना कोड तैयार करने के लिए, jqXHR.done (), jqXHR.done का उपयोग करें। .fail (), और jqXHR.always () के बजाय। "

मैंने ऐसा किया और यहाँ लुसियानो का अपडेटेड कोड स्निपेट है:

$.getJSON("example.json", function() {
  alert("success");
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function() { alert('getJSON request failed! '); })
.always(function() { alert('getJSON request ended!'); });

और त्रुटि विवरण के साथ एक स्ट्रिंग के रूप में सभी डेटा को दिखाने के साथ:

$.getJSON("example.json", function(data) {
  alert(JSON.stringify(data));
})
.done(function() { alert('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { alert('getJSON request failed! ' + textStatus); })
.always(function() { alert('getJSON request ended!'); });

यदि आपको अलर्ट पसंद नहीं हैं, तो उन्हें प्रतिस्थापित करें console.log

$.getJSON("example.json", function(data) {
  console.log(JSON.stringify(data));
})
.done(function() { console.log('getJSON request succeeded!'); })
.fail(function(jqXHR, textStatus, errorThrown) { console.log('getJSON request failed! ' + textStatus); })
.always(function() { console.log('getJSON request ended!'); });

क्या किया गया कालानुक्रमिक क्रम, विफल, हमेशा और getJSON के अंदर कोड है?
19

नोट: IE7 के रूप में पुराने ब्राउज़रों में कंसोल.लॉग लागू नहीं किया गया है! बस मामले में आप इसका इस्तेमाल करते हैं!
MadMad666

12

मुझे पता है कि किसी को यहां उत्तर देने में थोड़ी देर हो गई है और पोस्टर को शायद पहले से ही यहां या कहीं और से अपना जवाब मिल गया है। हालाँकि मुझे लगता है कि यह पोस्ट किसी को भी रास्ता दिखाने में मदद करेगी, जबकि गेटजन्स अनुरोधों को करते समय त्रुटियों और समय-समय पर नज़र रखने के लिए। इसलिए सवाल के मेरे जवाब के नीचे

GetJSON संरचना इस प्रकार है ( http://api.jqueri.com पर पाया गया ):

$(selector).getJSON(url,data,success(data,status,xhr))

अधिकांश लोग उस उपयोग को लागू करते हैं

$.getJSON(url, datatosend, function(data){
    //do something with the data
});

जहां वे JSON डेटा का लिंक प्रदान करने के लिए url var का उपयोग करते हैं, डेटाटोसेंड को जोड़ने के स्थान के रूप में "?callback=?" और अन्य चर जिन्हें सही JSON डेटा प्राप्त करने के लिए भेजा जाना है, और डेटा को संसाधित करने के लिए एक फ़ंक्शन के रूप में सफलता का कवक। ।

आप हालांकि अपने सफलता समारोह में स्थिति और xhr चर जोड़ सकते हैं। स्टेटस वैरिएबल में निम्न स्ट्रिंग्स में से एक होता है: "सफलता", "नोट्मोडिफ़ाइड", "एरर", "टाइमआउट", या "पार्सररोर", और xhr वेरिएबल में लौटे XMLHttpRequest ऑब्जेक्ट ( w3schools के लिए पाया गया ) होता है।

$.getJSON(url, datatosend, function(data, status, xhr){
    if (status == "success"){
        //do something with the data
    }else if (status == "timeout"){
        alert("Something is wrong with the connection");
    }else if (status == "error" || status == "parsererror" ){
        alert("An error occured");
    }else{
        alert("datatosend did not change");
    }         
});

इस तरह से कस्टम टाइमआउट ट्रैकर को लागू किए बिना टाइमआउट और त्रुटियों पर नज़र रखना आसान है जो अनुरोध के पूरा होने के बाद शुरू किया जाता है।

आशा है कि यह किसी को अभी भी इस प्रश्न का उत्तर ढूंढने में मदद करता है।


2
यह काम नहीं करता है। "सफलता" कॉलबैक, जैसा कि इसके नाम का अर्थ है, केवल सफलता पर कहा जाता है। (इसलिए मुझे यकीन नहीं है कि "स्थिति" पैरामीटर क्या है ...)
जुलाव्स

4

$.getJSON("example.json", function() {
  alert("success");
})
.success(function() { alert("second success"); })
.error(function() { alert("error"); })

इसे jQuery 2.x में ठीक किया गया है; JQuery 1.x में आपको एक त्रुटि कॉलबैक कभी नहीं मिलेगा


1

मुझे इसी मुद्दे का सामना करना पड़ा, लेकिन एक असफल अनुरोध के लिए कॉलबैक बनाने के बजाय, मैंने बस जोंस डेटा ऑब्जेक्ट के साथ एक त्रुटि वापस कर दी।

यदि संभव हो, तो यह सबसे आसान समाधान की तरह लगता है। यहां मैंने उपयोग किए गए पायथन कोड का एक नमूना दिया है। (फ्लास्क का उपयोग करते हुए, फ्लास्क के जेनिसिफ़ एफ और एसक्यूएलचेमी)

try:
    snip = Snip.query.filter_by(user_id=current_user.get_id(), id=snip_id).first()
    db.session.delete(snip)
    db.session.commit()
    return jsonify(success=True)
except Exception, e:
    logging.debug(e)
    return jsonify(error="Sorry, we couldn't delete that clip.")

फिर आप इस तरह से जावास्क्रिप्ट पर जांच कर सकते हैं;

$.getJSON('/ajax/deleteSnip/' + data_id,
    function(data){
    console.log(data);
    if (data.success === true) {
       console.log("successfully deleted snip");
       $('.snippet[data-id="' + data_id + '"]').slideUp();
    }
    else {
       //only shows if the data object was returned
    }
});

सर्वर के भीतर होने वाली त्रुटियों के लिए यह ठीक है, लेकिन यह तब कैप्चर नहीं करता है जब कॉल सर्वर तक नहीं पहुंच सकती है या सर्वर कोड को हिट करने से पहले कोई त्रुटि है, जैसे कि एक एमवीसी उपयोगकर्ता अब प्रमाणित नहीं है।
ली ओड्स

1

क्यों नहीं

getJSON('get.php',{cmd:"1", typeID:$('#typesSelect')},function(data) {
    // ...
});

function getJSON(url,params,callback) {
    return $.getJSON(url,params,callback)
        .fail(function(jqXMLHttpRequest,textStatus,errorThrown) {
            console.dir(jqXMLHttpRequest);
            alert('Ajax data request failed: "'+textStatus+':'+errorThrown+'" - see javascript console for details.');
        })
}

??

उपयोग की गई .fail()विधि (jQuery 1.5+) के विवरण के लिए , http://api.jquery.com/jQuery.ajax/#sqqHR देखें

चूंकि jqXHRफ़ंक्शन द्वारा लौटाया जाता है, जैसे एक चिनिंग

$.when(getJSON(...)).then(function() { ... });

संभव है।


0

कुछ मामलों में, आप इस पद्धति के साथ सिंक्रनाइज़ेशन की समस्या में भाग सकते हैं। मैंने कॉलबैक कॉल ए के अंदर लिखाsetTimeout फ़ंक्शन के , और यह तुल्यकालिक रूप से ठीक काम किया =)

ईजी:

function obterJson(callback) {


    jqxhr = $.getJSON(window.location.href + "js/data.json", function(data) {

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