2009-06-19 8 views
4

私はjsonレスポンスをグローバル変数に保存したいので、getJSONリクエストを複数回実行することなくアプリケーションから使用できます。jQueryでJSONレスポンスを保存するには?

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


console.log(data); 

私は、実際の要求の罰金にそれを記録し、しかし、私は他のどこでも「未定義」を取得した場合。 すべてのコメントが詳細です。

編集[コメントからコピー]:試しました...

$.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の例から:注意:この関数の後の行は、コールバックの前に実行されることに注意してください。 –

+0

あなたはアップデートについて正しいかもしれませんが、私のグローバル変数が更新されたかどうか正確にわかりますか?または私は私のグローバルvarが私がそれを使用する前に更新されるように私の要求を入れなければならない、私が考えることができるのは、リクエストのコールバックにすべてを書いているが、それは愚かに聞こえるでしょう:) – soda01

答えて

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"); 
} 
+0

私はそれが最終的にタイミングの問題であると思った。ちょうどフラグとsetIntervalチェックを使用して実装され、それは正常に動作します – soda01

+0

実際に両方のメソッドは面白いことを働いた私の要求は関数であったと私は同じ関数でリクエスト後に私のグローバル変数にアクセスしようとしたとき私はそれがあなたのおかげで働いてくれた機能の外でそれにアクセスしました – soda01

+0

@ soda1、StackOverflowでのコンベンションは、答えを投稿するのではなく、元の質問を更新することです。 –

1

DOMの属性(#IDなど)に挿入し、必要に応じて取得できます。

+0

それは大丈夫でしょう単純な文字列実際に巨大なJSONオブジェクト – soda01

0

変数を1つの$(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 = { 結果 "未設定" } $(ドキュメント).ready(関数(){ $ .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。); }) 最初のログはokですが、2番目は、私はここの周りにちょっと新たなんだ、それはフォーマットするように – soda01

+0

定義されていませんうまく。 – soda01

+0

soda01 @、私はあなたの質問にあなたのコメントでソースをコピーし、まだunstyledコメントして申し訳ありません –

0

$ .getJSONは、AJAXリクエスト(質問されて、非同期の範囲にキーワードを)発射それはhasnので.Your変数が定義されていませんまだ定義されていないが、応答は完了していない。他の人はあなたのコードでconsole.logをさらに動かすことを提案しましたが、あなたのロジックがコールバック関数と同期されていない限り、それが使用可能であるという保証はありません。 $ .getJSONは、パラメータの1つとしてコールバック関数を受け入れます。

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