JSONレスポンスをjQueryに保存する方法は?
質問
json応答をグローバル変数に保存したいので、getJSONリクエストを複数回行うことなく、アプリで使用できます。
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);
}) ;
最初のログは問題なく、2番目のログは未定義です。
[回答からコピー]を編集:
実際には両方の方法が機能しました
興味深いのは、 要求は関数内にあり、私は試しました グローバル変数の権利にアクセスする 同じ関数内のリクエストの後
関数の外部にアクセスしたとき 魔法のように働いた
解決
実際のコードがそのように構成されている場合、設定されていないデータにアクセスしようとするとまだ問題が発生します。 $。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");
}
他のヒント
DOMの属性(#IDなど)に挿入し、必要に応じて取得できます。
変数を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']);
});
$。getJSONはajaxリクエストを開始します(質問のスコープ内のキーワードは非同期です)。変数はまだ定義されていないため、未定義であり、応答は完了していません。他の人々は、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
});
});