在你的第一個例子中,你在回調中做$ .each。在收到結果之後,回調會執行其他回調,而$ .getJSON立即返回而不等待結果(因爲JavaScript中沒有設計阻止)。
因此,第二個示例中的代碼無法工作:$ .each在從Web服務器收到任何結果之前開始,可能甚至在發送請求之前開始。不管$ .getJSON的返回值是什麼,它都不能通過JavaScript的設計得到,成爲AJAX請求的結果。
UPD:看到您的評論,現在我明白你想要做什麼。這裏有一個如何做一個簡單的例子:
function ActualHandler(data) {
$.each(data, function(index) {
$('#div1').append(index);
});
}
function KeypressHandler() {
if (window.my_data) { // If we have the data saved, work with it
ActualHandler(window.my_data);
}
else { // Otherwise, send the request, wait for the answer, then do something
$.getJSON('dimensions.json', function(data) {
window.my_data = data; // Save the data
ActualHandler(data); // And *then* work on it
});
}
}
這裏,在接收到數據之前ActualHandler不啓動,一旦出現這種情況,所有後續的點擊將立即進行處理。
在這種特殊情況下的缺點是,如果用戶在第一次請求運行時再次單擊,則會再發送一次。但是爲了解決這個問題,你需要維護一些隊列,這在範圍之外。
你比較了console.log(data)和console.log(JSONstr)嗎? – 2012-01-07 23:37:55
你爲什麼想這樣做? (你不能,爲什麼我問。) – Pointy 2012-01-07 23:38:42
@Pointy - 第一個代碼片段被包含在'keypress'函數中,所以在每次按下某個鍵時,我的腳本正在獲取json文件。我想把它取到一次var,然後在var上運行keypress函數。 – 2012-01-07 23:40:59