2010-02-01 88 views
45

我必須做一些非常簡單的事情,但據我所知,似乎並沒有簡單的方法來做到這一點。我只想從遠程源加載JSON數據並使用jQuery將其存儲在全局JavaScript變量中。這裏是我的:將json加載到變量

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保持爲空。看來你必須使用回調函數來返回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將異步運行的主要問題,因此你的Javascript將進度完成它調用它甚至表達在它的success回調觸發之前,所以不能保證你的變量將捕獲任何數據。

特別注意上述ajax調用中的'async': false選項。該manual說:

默認情況下,所有的請求被髮送 異步(即這是默認設置爲true )。如果您需要同步 請求,請將此選項設置爲false。 請注意,當 請求處於活動狀態時,同步請求可能會暫時鎖定瀏覽器 以禁用任何操作。

+0

只是爲了說明我的好處:即使我在成功回調期間將數據返回給變量,$ .getJSON對於同步樣式請求從來也不是一個好選擇? – user1026169 2013-04-20 20:54:41

+0

對於相關信息+1,但爲什麼你要在函數的開始時使json變量爲null。 – Manoj 2014-06-13 12:30:19

+0

@Manoj有兩個原因[1]這個塊可能在一個方法內部,並被多次調用。因此,這將刷新json變量。但是,如果ajax請求會更新這個問題,那有什麼意義呢?那麼,因爲... [2]這是一個編碼約定,因爲ajax請求失敗,那麼用戶可以測試json是否爲空。如果是,則可以假定ajax請求失敗 – 2014-10-21 22:10:17

25

碼位應爲:

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

+1不使用'var'兩次 – 2010-02-01 15:18:48

+3

這如何避免上述問題的異步? – user1026169 2013-04-20 20:55:18

+1

很可能試圖強制同步ajax調用是一個壞主意,ajax是用於異步調用。這個答案應該是針對問題描述的問題的理想解決方案,從我+1。 – Buyuk 2015-07-14 10:50:52

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

歡迎來到堆棧溢出:-)只有代碼的答案對社區沒有用處,請解釋爲什麼你的代碼可以解決這個問題。 – JimHawkins 2017-07-13 10:48:09