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

È stato utile?

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
    });
});
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top