2010-02-01 9 views
45

मुझे कुछ बहुत आसान करना है, लेकिन ऐसा करने का एक आसान तरीका प्रतीत नहीं होता है, जहां तक ​​मैं कह सकता हूं। मैं सिर्फ एक दूरस्थ स्रोत से JSON डेटा लोड करना चाहता हूं और इसे jQuery का उपयोग कर वैश्विक जावास्क्रिप्ट चर में संग्रहीत करना चाहता हूं। यहां मेरे पास है:लोड जेसन परिवर्तनीय

var my_json; 
$.getJSON(my_url, function(json) { 
    var my_json = json; 
}); 

my_json चर अपरिभाषित रहता है। मुझे लगता है कि यह स्पष्ट रूप से एक गुंजाइश मुद्दा है। मुझे लगता है कि $ .getJSON विधि JSON वापस करनी चाहिए, लेकिन यह एक XMLHttpRequest ऑब्जेक्ट देता है। मैं ऐसा करते हैं तो:

request = $.getJSON(my_url); 
my_json = request.responseText.evalJSON(); 

ऐसा इसलिए है क्योंकि readyState == 4 जब तक काम नहीं करता, responseText अशक्त बना हुआ है। ऐसा लगता है कि आपको प्रतिक्रिया प्रतिक्रिया वापस करने के लिए कॉलबैक फ़ंक्शन का उपयोग करना होगा, क्योंकि यह सफलता पर आग लगती है।

यह कठिन नहीं हो सकता है! सही?

उत्तर

115

यह यह करना होगा:

var json = (function() { 
    var json = null; 
    $.ajax({ 
     'async': false, 
     'global': false, 
     'url': my_url, 
     'dataType': "json", 
     'success': function (data) { 
      json = data; 
     } 
    }); 
    return json; 
})(); 

मुख्य मुद्दा यह है कि $.getJSON एसिंक्रोनस रूप से चलेंगे किया जा रहा है, इस प्रकार आपके जावास्क्रिप्ट अभिव्यक्ति जो इसे और भी आह्वान अतीत प्रगति होगी success कॉलबैक आग से पहले, इसलिए कोई गारंटी नहीं है कि आपका चर किसी भी डेटा को कैप्चर करेगा।

विशेष रूप से उपरोक्त AJAX कॉल में 'async': false विकल्प नोट करें। manual का कहना है:

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

+0

बस मेरे लाभ के लिए स्पष्टीकरण के लिए: $ .getJSON सिंक्रोनस स्टाइल अनुरोधों के लिए कभी भी अच्छा विकल्प नहीं है, भले ही मैं सफलता कॉलबैक के दौरान अपने चर में डेटा वापस करूं? संबंधित जानकारी के लिए – user1026169

+0

+1 लेकिन आप फ़ंक्शन की शुरुआत में जेसन परिवर्तनीय शून्य क्यों बना रहे हैं। – Manoj

+0

@Manoj 2 कारण हैं [1] यह ब्लॉक एक विधि के अंदर हो सकता है, और कई बार कहा जाता है। इसलिए यह जेसन वैरिएबल रीफ्रेश करेगा। लेकिन अगर AJAX अनुरोध इसे अद्यतन करेगा तो वैसे भी क्या बात है? ठीक है क्योंकि ... [2] यह एक कोडिंग सम्मेलन है जो AJAX अनुरोध विफल रहता है, तो उपयोगकर्ता जांच सकता है कि जेसन शून्य है या नहीं। यदि ऐसा है, तो यह माना जा सकता है कि AJAX अनुरोध –

25

कोड बिट पढ़ना चाहिए:

var my_json; 
$.getJSON(my_url, function(json) { 
    my_json = json; 
}); 
+5

+1 दो बार –

+3

'var' का उपयोग नहीं करते कि यह कैसे अतुल्यकालिक मुद्दा ऊपर उल्लेख से बचने करता है? – user1026169

+1

शायद सिंक्रोनस AJAX कॉल को मजबूर करने का प्रयास करना एक बुरा विचार है, AJAX एसिंक्रोनस कॉल के लिए था। यह उत्तर प्रश्न में वर्णित किसी समस्या के लिए वांछित समाधान होना चाहिए, मेरे द्वारा +1। – Buyuk

0
<input class="pull-right" id="currSpecID" name="currSpecID" value=""> 

    $.get("http://localhost:8080/HIS_API/rest/MriSpecimen/getMaxSpecimenID", function(data, status){ 
     alert("Data: " + data + "\nStatus: " + status); 
    $("#currSpecID").val(data); 
    }); 

enter image description here enter image description here

0

var itens = null; 
 
$.getJSON("yourfile.json", function(data) { 
 
    itens = data; 
 
    itens.forEach(function(item) { 
 
    console.log(item); 
 
    }); 
 
}); 
 
console.log(itens);
<html> 
 
<head> 
 
<script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script> 
 
</head> 
 
<body> 
 
</body> 
 
</html>

+2

स्टैक ओवरफ़्लो में आपका स्वागत है :-) कोड-केवल उत्तर समुदाय के लिए उपयोगी नहीं हैं। कृपया बताएं कि आपका कोड समस्या का समाधान क्यों करता है। [answer] – JimHawkins