2

這使我瘋狂。我無法用Firebug來完成它。有人能解釋一下這裏發生了什麼嗎?Javascript - 值存在,然後消失,然後再次出現?

基本上我有一個傳入的文本文件,其中每行包含管道分隔的記錄。我將它們分解爲一個字符串數組數組,以便以後在自動完成文本框中使用。代碼如下:

<script type="text/javascript"> 
$(function() { 

    var rawData = new Array(); 
    $.get("/sample.txt", 
     function (data) { 
      var raw = data.split('\n'); 
      for (var i = 0; i < raw.length; i++) { 
       rawData.push(raw[i].split('|')); 
      }; 
      alert(rawData); // 1st sanity check 
     } 
    ); 
    alert(rawData); // 2nd sanity check 
    alert(rawData); // 3rd sanity check 

由於某種原因,第一個完整性檢查工作正常 - 它顯示所有數據,如我所料。第二個顯示rawData爲空,但第三個顯示所有數據。取消第一次完整性檢查不會影響第二次和第三次。

這怎麼可能?這是爲什麼?這真讓我抓狂。

+0

這是weeeiird ... – 2011-06-09 02:12:07

回答

5

您忘記了get()函數是一個異步函數。您在裏面定義的回調只會在文件加載後纔會被調用。本質上,JavaScript解釋器將其放入隊列中,以便在動作完成時準備好,然後允許其餘的代碼執行。

因此,您在回調中的警報將反映文件已加載的事實。外部警報將在該文件加載之前執行。當然,等待解散第二次警報的時間越長,加載所有數據時第三次警報的更改就越好。

+0

讓我困惑的一點是,第一個警報將首先觸發(大概是異步函數),然後第二個警報用空值觸發,然後第三個警報用一個值再次觸發。對我來說,這是沒有意義的,異步或其他。 – nathanchere 2011-06-09 03:05:32

+0

基本上,在第一次警報被調用的時候,數據已經被加載......並且我看不到第二次警報仍然沒有數據,即使它正在用最初爲空的rawData排隊值,因爲它肯定會出現在$ .get - 觸發的警報之前,如果是這樣的話? – nathanchere 2011-06-09 03:07:59

+0

這不是一個完全確定的答案,但它足以讓我克服這個特殊的障礙 - 將原始數據相關的代碼放在$ .get函數中就可以實現。謝謝! – nathanchere 2011-06-09 03:18:27

相關問題