2012-10-08 51 views
-1
function getData(jsonAddress) { 
     var data = new Array(); 
     var xhr = $.getJSON(jsonAddress, function(meas) { 
     for (var i = 0; i < meas.length ; i++) { 
      var dt = datetimeSplitter(meas[i].valuedate); 
      data[i] = [Date.UTC(dt[0],dt[1]-1,dt[2],dt[3],dt[4],dt[5]),parseInt(meas[i].value,10)]; 
     }; 
     }); 
     alert(data); 
    } 

我想讓變量「data」可用於函數getData,所以我可以返回它(在本例中爲alert)。我知道這是一個範圍問題,可以通過關閉來解決。我也理解什麼是閉包,但絕對不知道這個特定情況的語法。jQuery中的JavaScript作用域

+4

該變量可用,但'* .getJSON'響應返回之前發生'alert()',因爲'$ .getJSON'是* asynchronous *。所以這不是一個範圍問題,這是一個時間問題。你的'alert(data);'需要在回調函數中。這就是爲什麼有一個回調函數。 –

回答

5

這不是範圍問題,它是異步回調的問題。

您需要將回調函數傳遞給此方法,以獲得您的getJSON()調用的響應。

+0

如果我提醒getJSON回調中的數據,我可以看到數據被檢索到,但我不知道如何讓變量進入上方作用域的語法,如果您知道解決方案只是編寫示例。 –

3

$.getJSON(jsonAddress, function(meas)....是一個異步調用,即警報語句將在調用回調函數(其中數據用響應值設置)之前調用。如果您在回調函數內移動警報,您將看到它具有正確的值。

+0

我知道,但我需要多次調用一個函數,我希望有一種方法可以將它包裝在一個函數中。 –

+0

@ pm.calabrese:你需要學會處理異步代碼。 **步驟1:**將您的函數簽名更改爲:function getData(jsonAddress,callback){'。 **第2步:**在回調內*(在for循環之後),執行此操作:'callback(data);'。 **第3步:**每當你調用getData()時,傳遞一個函數作爲第二個參數,如下所示:'getData(「http://example.com/」,function(data){alert(data) ;});' –

+0

這正是我需要的!謝謝! –

0

如果你真的不能像以前建議的那麼多次使用異步調用,還可以使用($ .ajax)[http://api.jquery.com/jQuery.ajax/]代替 - $。 getJSON只是它的一個變體 - 並且使其同步 - 請注意,這不是建議的方式,因爲在瀏覽器同步檢索數據時,應用程序將被阻止。