2009-06-19 124 views
4

我想將我的json響應存儲在全局變量中,因此,我可以通過我的應用程序使用它,而不會多次發出getJSON請求。如何在JQuery中存儲JSON響應?

var data; 
$.getJSON("panorama.json",function(json){ 
data = json.images[0].src; 
console.log(data);   
}); 


console.log(data); 

如果我在實際的請求中記錄它的罰款,但我得到「未定義」的其他地方。 任何評論appriciated。

編輯[從評論複製]:試了...

$.myglobals = { result: "unset" } 

$(document).ready(function() { 

    $.getJSON("panorama.json", function(json) { 
    $.myglobals.result = json.images[0].src; 
    console.log($.myglobals.result);  
    }); 

    console.log($.myglobals.result); 
}) ; 

第一個日誌是好的,第二個是不確定的。

編輯[從答案複製]:

實際上兩者方法奏效

有趣的是,我的 請求是一個功能,我試圖 進入電影我的全局變量後右 請求在同一功能

當我在功能外面加上它 它像一個魅力

+0

我不知道你是否正在訪問你的全局變量之前,它得到更新?從JQuery示例中:注意:請記住,該函數之後的那些行將在回調之前執行。 – 2009-06-19 21:28:11

+0

你可能是正確的更新,但我怎麼能告訴我的全局變量是否已經更新?或者我應該在哪裏放我的請求,以便在我使用它之前更新我的全局變量,我唯一能想到的就是在請求的回調中寫入所有內容,但這聽起來很傻:) – soda01 2009-06-19 21:43:29

回答

8

如果您的真實代碼是這樣構建的,那麼您在嘗試訪問尚未設置的數據時遇到問題尚未。僅僅因爲您的$.getJSON()高於console.log()並不意味着您在記錄數據值之前得到響應。

所以你的問題不是範圍,而是時間:引入一些服務器端延遲,你的解決方案可能會崩潰。

也許你應該設置一些標誌,如果收到響應:

var data, dataReceived = false; 

$.getJSON("panorama.json",function(json){ 
    data = json.images[0].src; 
    dataReceived = true; 
    console.log(data);      
}); 


// somwhere later 
if (dataReceived) { 
    console.log(data); 
} else { 
    // you could use setTimeout() or setInterval here to re-check 
    console.log("data not received yet"); 
} 
1

您可以將其插入DOM中的屬性(例如#ID)並根據需要檢索它。

+0

我想如果它是可以的,一個簡單的字符串,但實際上它是一個巨大的JSON對象 – soda01 2009-06-19 21:01:14

0

這是一種讓您在一個$(document).ready()中設置變量並在不同的$(document).ready()中使用它的方法。 myglobals是一個命名空間對象,可以減少您的全局變量與其他人碰撞的機會,特別是如果您將它命名爲比「myglobals」更聰明的東西。

$.myglobals = { 
    result: "unset" 
} 

$(document).ready(function() { 

    function pretend_JSON_call() { 
    $.myglobals.result = {'a':"hello", 'b':"world" }; 
    } 

    pretend_JSON_call(); 
}); 

$(document).ready(function() { 
    alert($.myglobals.result['a']); 
    alert($.myglobals.result['b']); 
}); 

Transient link以上代碼在jsbin中。

+0

$ .myglobals = { 結果: 「未設置」 } $(文件)。就緒(函數(){ $ .getJSON( 「panorama.json」 功能(JSON){ \t \t \t \t \t \t \t \t \t \t \t \t \t \t $ .myglobals.result = json.images [0] .src; \t \t \t \t console.log($。myglobals.result); \t \t \t }); \t \t \t \t \t \t console.log($。myglobals.result); }) 第一個日誌是好的,但第二個是仍不明確 – soda01 2009-06-19 20:39:08

0

$ .getJSON觸發一個Ajax請求(在這個問題是異步的,範圍關鍵字)。您的變量是不確定的,因爲它不是招」還沒有定義,反應還沒有完成。其他人建議將你的console.log進一步放在你的代碼中,但是不能保證它可以使用,除非你的邏輯和一個回調函數同步。 $ .getJSON接受一個回調函數作爲其參數之一。

$.getJSON("myData.json", function(data) { 
    //Do whatever, this is a callback 
    $.each(data, function(key, val) { 
     //You can get even more specific like so 
    }); 
});