2012-04-19 86 views
1

基於Chrome開發人員工具的一個斷點,我想我正在處理一個範圍問題,我可以弄清楚。這是我定義函數的方式嗎?下面的腳本是一個包含js文件和我希望可用於其他函數的數組'timeStamp,而不必每次都調用loadData函數。javascript以外的範圍

timeStamp數組一旦離開for循環,甚至離開函數,它就會變成undefined。

var timeStamp = []; // Want this array to be global 

function loadData (url){ 

     $.getJSON(url, function(json) { 

      for (var i=0;i<json.length;i++){ 
        timeStamp.push(json[i].TimeStamp); 
       } 
        console.log(inputBITS); //returns the value 
      }); 
     console.log(inputBITS); //undefined 
     } 

感謝您anyhelp

回答

6

它看起來像問題是,getJSON是異步的。當它執行並完成並且代碼繼續運行時,它僅指示聯網操作的開始以檢索數據。實際的網絡操作直到一段時間纔會完成。

完成後,會調用成功處理程序(指定爲您的getJSON()調用的第二個參數),然後填充timeStamp數組。僅在調用成功處理程序之後,timeStamp數組纔有效。

因此,您不能在代碼中使用timeStamp陣列,該代碼緊隨getJSON()調用(尚未填充)。如果其他代碼需要timeStamp數組,則應該從成功處理程序調用該代碼或使用其他一些計時機制來確保使用timeStamp數組的代碼在嘗試成功處理程序之後纔會嘗試使用它,並且timeStamp數組已填充。

有可能使一些Ajax調用是同步的而不是異步的,但這通常是一個非常糟糕的主意,因爲它在整個網絡操作過程中鎖定瀏覽器,這對觀衆來說非常不友好。修復編碼邏輯以適應異步網絡要好得多。

爲Ajax調用像這樣的典型設計模式如下:

function loadData (url){ 

    $.getJSON(url, function(json) { 
     // this will execute AFTER the ajax networking finishes 
     var timeStamp = []; 
     for (var i=0;i<json.length;i++) { 
       timeStamp.push(json[i].TimeStamp); 
     } 
     console.log(timeStamp); 
     // now call other functions that need timeStamp data 
     myOtherFunc(timeStamp); 
    }); 
    // this will execute when the ajax networking has just been started 
    // 
    // timeStamp data is NOT valid here because 
    // the ajax call has not yet completed 
    // You can only use the ajax data inside the success handler function 
    // or in any functions that you call from there 
} 
+0

謝謝你的解釋。去檢查成功處理程序。 – rd42 2012-04-19 21:30:50

+1

@ rd42 - 你已經有一個成功處理程序。這是匿名函數,它被聲明爲getJSON調用的第二個參數。這是在ajax調用成功完成時調用的函數。它在ajax網絡完成後的某段時間被調用。 – jfriend00 2012-04-19 21:36:40

+0

我有點困惑。兩個console.logs()都在函數中,但只有一個被定義,第二個console.log()在加載數組之前不會被調用,對吧? – rd42 2012-04-19 21:38:16

2

而這裏的其他人誰不懂得基本的AJAX ...

getJSON異步。意思是,代碼在函數調用之後和成功返回JSON請求之前保持運行。

您可以通過強制的要求是同步有相應的標誌「修理」這一點,但是這是有很多原因(其中最重要的一個非常糟糕的想法是,你違反了一個 的基本思路JAX)。最好的方法是記住AJAX是如何工作的,而不是把AJAX返回時應該執行的所有代碼放在正確的位置。

+0

謝謝。除了「正確的地方」,我還可以谷歌嗎? – rd42 2012-04-19 21:28:27

+1

只需將它放在您定義的匿名函數中,您可以在其中看到正在記錄的變量的正確值。 – 2012-04-19 21:29:05