2013-10-15 84 views
0

我在加載後立即使用從JSON文件加載的數據時遇到了一些問題。下面的代碼。從JSON文件加載後立即使用數據結果

newdata = [] 

$.getJSON(file, function(data) { 
      $.each(data.items, function(i,item){ 
      if (item.id != undefined) { 
       if (item.id === cl) { 
        newdata.push(item.id); 
       } 
      } 
      }); 
     }); 

console.log(newdata); 

console.log語句不返回,雖然該數據,則返回一個空數組[]。但是,如果我在我的chrome調試器中調用變量data,它將返回正確的數組。在我從JSON文件創建數據後,如何使用正確的元素立即使用數據?

+0

'getJSON'以異步方式將數據返回給回調函數。因此,''console.log'在'data'返回之前執行。 – thefourtheye

+0

您的'console.log'在您的請求完成之前正在觸發。數據在回調中完全按照您的預期提供。在這個確切的話題上有200個問題。 – Mathletics

+0

* A *中的* A * jax。 –

回答

1

應該這樣寫,

newdata = [] 

$.getJSON(file, function(data) { 
      $.each(data.items, function(i,item){ 
      if (item.id != undefined) { 
       if (item.id === cl) { 
        newdata.push(item.id); 
       } 
      } 
      }); 
       console.log(newdata); 
     }); 
+0

發生了一個命名錯誤,第一個數據= []應該是newdata = []。所以日誌記錄數據與記錄新數據不同。有什麼方法可以解決異步問題嗎? –

+0

已將其更新爲新數據。異步行爲是ajax如何工作的,所以你必須在回調中應用你的邏輯。 – melc

+0

@ q2liu AJAX中的「A」代表「異步」。你真的**不希望是同步的(只是想想這意味着什麼)。 – nietonfir

0

jQuery.getJSON異步。您should read the documentation on it熟悉它的成功回調是如何工作的。

成功調用接收JSON數據的函數,但實際的$.getJSON函數立即返回並繼續執行。因此,實際上,這意味着您的console.log(data)會在JSON數據恢復之前得到執行,但在您通過Chrome控制檯手動記錄時,數據已被檢索到。

jQuery AJAX方法也返回objects that implement a promise-like API,所以你也可以使用它。

關於堆棧溢出和其他資源的這個話題有很多很多的問題。

以下代碼使用success函數參數和Deferred對象方法。你可以用handleData函數中的數據做任何你想做的事情。

function handleData(data) { 
    // you can do whatever you want with your data here 
    console.log(data); 
} 

function formatData(data) { 
    var formatted = []; 
    $.each(data.items, function(i,item){ 
     if (item.id != undefined) { 
      if (item.id === cl) { 
       formatted.push(item.id); 
      } 
     } 
    }); 
    return formatted; 
} 

$.getJSON(file, formatData).done(handleData); 
0

另一種方法是:

$.ajaxSetup({ 
    async: false 
}); 

但後被指出該方法已過時,並且更好的方式來做到這一點是由MELC和托馬斯·厄普頓給出。

+0

[官方文檔](http://api.jquery.com/jQuery.ajaxSetup/)強烈建議不要使用'jQuery.ajaxSetup'。您可以在該單獨的'。.getJSON'調用上設置該選項,但您爲什麼希望它是同步的? –

+0

此外,[見這裏](http://api.jquery.com/jQuery.ajax/#jQuery-ajax-settings),從jQuery 1.8開始,「async:false」的使用已被棄用,延期「方法。 –

+0

好點,編輯答案,並使用melc的解決方案。 –

相關問題