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

War es hilfreich?

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
    });
});
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top