Come archiviare la risposta JSON in jQuery?
Domanda
Vorrei archiviare la mia risposta json in una variabile globale in modo da poterla utilizzare tramite la mia app senza fare una richiesta getJSON più di una volta.
var data;
$.getJSON("panorama.json",function(json){
data = json.images[0].src;
console.log(data);
});
console.log(data);
Se accedo alla richiesta effettiva, va bene, ma ottengo " undefined " in qualsiasi altro posto. Qualsiasi commento valutato.
Modifica [copiato dai commenti]: provato ...
$.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);
}) ;
Il primo log è a posto, il secondo non è definito.
Modifica [copiato dalla risposta]:
in realtà entrambi i metodi hanno funzionato
la cosa interessante è che il mio la richiesta era in una funzione e ho provato per accedere alla mia variabile globale a destra dopo la richiesta nella stessa funzione
quando ho effettuato l'accesso al di fuori della funzione ha funzionato come un fascino
Soluzione
Se il tuo codice reale è strutturato in questo modo, hai un problema con il tentativo di accedere ai dati che non sono stati ancora impostati . Solo perché $ .getJSON ()
è sopra console.log ()
non significa che ottieni la risposta prima di registrare il valore dei dati.
Quindi il tuo problema non è l'ambito, ma piuttosto i tempi: introdurre un certo ritardo sul lato server e la soluzione potrebbe anche andare in crash.
Forse dovresti impostare qualche flag se la risposta è stata ricevuta:
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");
}
Altri suggerimenti
Potresti inserirlo in un attributo nel DOM (come un #ID) e recuperarlo secondo necessità.
Ecco un approccio che ti consente di impostare la variabile in un $ (documento) .ready () e di usarla in un altro $ (documento) .ready (). myglobals
è un oggetto dello spazio dei nomi che probabilmente riduce le possibilità che la tua variabile globale si scontri con quella di qualcun altro, specialmente se lo chiami qualcosa di più intelligente di " 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']);
});
Link temporaneo al codice sopra riportato in jsbin.
$ .getJSON genera una richiesta ajax (la parola chiave nell'ambito della domanda è asincrona). La tua variabile non è definita perché non è stata ancora definita, la risposta non è terminata. Altre persone hanno suggerito di spostare la console.log più in basso nel codice, ma non c'è garanzia che sarà utilizzabile a meno che la logica non sia sincronizzata con una funzione di callback. $ .getJSON accetta una funzione di callback come uno dei suoi parametri.
$.getJSON( "myData.json", function( data ) {
//Do whatever, this is a callback
$.each( data, function(key, val) {
//You can get even more specific like so
});
});