2011-07-26 189 views
1

我如何設置js全局變量在onload事件中的json結果集?將JavaScript全局變量設置爲JSONresult?

var global = []; 

    $.getJSON("<%: Url.Action("myUrl", "con") %>/", 
    function(data) { 
      $.each(data, function(key, val) { 
      global.push(val); 
      }); 
    }); 

全球沒有一個值負載設置,我需要訪問它的JSON外呼......

+0

你的代碼聽起來很合理還要確保JSON有效(http://jsonlint.com/) – ctrlShiftBryan

回答

2

你再次。也許試試

var result; 
$.ajax({ 
    url: '<%: Url.Action("myUrl", "con") %>/', 
    dataType: 'json', 
    async: false, 
    success: function(data) { 
     result = data; 
    } 
}); 
// process result here 
+0

這設置結果,當我訪問結果後立即ajax調用它有一個值,當我嘗試訪問它在其他方法,它doesnt ... –

+0

我似乎無法訪問它的其他方法,所以它doesn似乎沒有在全球範圍內設置? –

+0

如果你想讓'result'成爲全局變量,只需刪除'var'。 – marc

0

你並不需要設置全局數組。只分配值。

var global = null; 

    $.getJSON("<%: Url.Action("myUrl", "con") %>/", 
    function(data) { 
      $.each(data, function(key, val) { 
      global = val; 
      }); 
    }); 
+0

這將導致'global'爲迭代的* last *值(並且迭代次序未定義,假設'data'是一個對象[它被定義爲數組],所以這可能會導致混沌行爲)。 –

+0

啊,我錯過了每一個。感謝您指出。 –

0

該代碼應該工作得很好。 (Live copy)聽起來像ajax調用沒有以您期望的形式返回數據時出現問題。

0

作爲@marc(間接)點,你必須瞭解ajax調用的性質和事件模型。 解析JS文件後立即執行ajax調用,結果以異步方式返回。因此,您的代碼時間軸看起來像

00 set global = [] 
01 AJAX call /someurl/ -------------------\ 
02 check global /* it's empty */   \ 
03 do something else     [process AJAX call on server, send result] 
...          /
42 AJAX call is completed <----------------/ 
43 call success ----------------------------------> global.push(result) 
44 at this point of time you can access global 

這是時間軸,而不是執行順序。 AJAX調用和響應之間的時間可能是任意的,包括超時或服務器端錯誤的情況。

因此,您應該怎麼做?

1)JS正常solurtion - 一個回調,你已經有了既可以

1.1)設置全局和調用其它功能成功的功能,或

1.2)做數據所需的操作

2)事件 - 這應該避免的99% - 如果你想使用在代碼中的多個部分數據,讀的jQuery事件機制

3)同步調用,如@marc建議更好案例。我知道什麼時候可能需要的唯一情況是當你必須要求來自第三方來源的強制性數據時,甚至在這種情況下你可以在服務器上做到這一點(儘管至少可以同步AJAX是可以接受的)