Wie JSON-Antwort in jQuery speichern?
Frage
Ich mag meine Json Antwort in einer globalen Variablen speichern, so, ich es durch meine app mehr ohne eine getJSON Anfrage als einmal verwendet werden kann.
var data;
$.getJSON("panorama.json",function(json){
data = json.images[0].src;
console.log(data);
});
console.log(data);
Wenn ich lüge sie in der eigentlichen Anfrage seiner Ordnung, aber ich erhalte „undefiniert“ überall sonst. Jeder Kommentar appriciated.
Bearbeiten [kopiert von den Kommentaren]: Versuchte ...
$.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);
}) ;
Das erste Protokoll ist in Ordnung, die zweite nicht definiert ist.
Bearbeiten [von Antwort kopiert]:
tatsächlich beiden Verfahren gearbeitet
Das Interessante ist, dass mein Anfrage war in Funktion und ich versuchte, mein globales Variable Recht auf acces nach der Anforderung in der gleichen Funktion
wenn ich accesed es außerhalb der Funktion es wie ein Charme
Lösung
Wenn Sie Ihr echter Code so strukturiert ist, dann haben Sie ein Problem mit dem Versuch, die Daten zuzugreifen, die nicht festgelegt wurden noch . Nur weil Ihre $.getJSON()
oben console.log()
ist, bedeutet nicht, dass Sie die Antwort erhalten, bevor Sie Wert von Log-Daten.
So Ihr Problem ist nicht Umfang, sondern das Timing. Einführen einige serverseitige Verzögerung und Ihre Lösung kann auch crash
Vielleicht sollten Sie einige Flag gesetzt, wenn Antwort empfangen wurde:
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");
}
Andere Tipps
Sie können es in ein Attribut in dem DOM (wie ein #ID) einfügen und abrufen es nach Bedarf.
Hier ist ein Ansatz, den Sie die Variable in einem $ (document) .ready () und verwenden Sie es in einem anderen $ (document) .ready kann (). myglobals
ist ein Namespace-Objekt, das wohl die Chancen Ihrer globalen Variablen verringert sich mit jemand anderem zu kollidieren, vor allem wenn man es etwas klüger als Name „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 zu dem obigen Code in jsbin.
$. GetJSON feuert eine Ajax-Anforderung (das Schlüsselwort in dem Rahmen der Frage asynchron) .Ihre Variable nicht definiert ist, weil es bisher noch nicht definiert hat, ist die Antwort noch nicht fertig. Andere Leute vorgeschlagen, um Ihre console.log weiter unten in Ihrem Code zu bewegen, aber es gibt keine Garantie, es verwendbar sein wird, es sei denn, Ihre Logik mit einer Callback-Funktion synchronisiert. $ .GetJSON akzeptiert eine Callback-Funktion als eine seiner Parameter.
$.getJSON( "myData.json", function( data ) {
//Do whatever, this is a callback
$.each( data, function(key, val) {
//You can get even more specific like so
});
});