2012-01-07 27 views
0

循環我有包含在keypress功能如下代碼:的getJSON串然後通過串

$.getJSON('dimensions.json', function(data) { 
    $.each(data, function(index) { 
     $('#div1').append(index); 
    }); 
}); 

我想先拿到JSON字符串,它保存在一個變量中,然後運行each()。我想基本上分開each()以取消與getJSON()函數的關聯,因爲我不希望它爲每個按鍵獲取json文件。

我已經試過這一點,但沒有奏效:

var JSONstr = $.getJSON('dimensions.json'); 
$.each(JSONstr, function(index) { 
    $('#div1').append(index); 
}); 
+1

你比較了console.log(data)和console.log(JSONstr)嗎? – 2012-01-07 23:37:55

+0

你爲什麼想這樣做? (你不能,爲什麼我問。) – Pointy 2012-01-07 23:38:42

+0

@Pointy - 第一個代碼片段被包含在'keypress'函數中,所以在每次按下某個鍵時,我的腳本正在獲取json文件。我想把它取到一次var,然後在var上運行keypress函數。 – 2012-01-07 23:40:59

回答

0

你掉進陷阱異步。您的$.each()函數不會等待您的$.getJSON()調用來獲取數據。你可以通過使用良好的'ol $.ajax()函數來解決這個問題。像這樣:

function processJSON(data) { 
    $.each(data, function(index) { 
     $('#div1').append(index); 
    }); 
} 

$.ajax({ 
    url: 'dimensions.json', 
    dataType: 'json', 
    async: false, 
    success: processJSON(data) 
}); 
+0

但是,這並不分開每個文件和正在提取的文件 – 2012-01-07 23:44:40

+0

正確的你,我編輯了我的答案。 – 2012-01-07 23:49:21

2

在你的第一個例子中,你在回調中做$ .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不啓動,一旦出現這種情況,所有後續的點擊將立即進行處理。

在這種特殊情況下的缺點是,如果用戶在第一次請求運行時再次單擊,則會再發送一次。但是爲了解決這個問題,你需要維護一些隊列,這在範圍之外。

+0

他希望$ .each()在$ .getJSON()回調之外運行。 – gengkev 2012-01-08 00:02:37

+0

也許你可以將JSON數據保存在一個變量中,然後用該變量onkeypress運行HandleJSON? – gengkev 2012-01-08 00:10:08

+0

準確地說,我的代碼是做什麼的,不是?除了第一次,在回調之外運行它的唯一選擇是a)在setInterval回調中b)完全不運行它c)在沒有任何數據的情況下運行它。這些看起來都不像我的解決方案。 – 2012-01-08 00:12:34