Question

J'aimerais stocker ma réponse json dans une variable globale afin de pouvoir l'utiliser via mon application sans effectuer plusieurs fois la requête getJSON.

var data;
$.getJSON("panorama.json",function(json){
data = json.images[0].src;
console.log(data);          
});


console.log(data);

Si je me connecte à la demande, c'est très bien, mais j'obtiens "undefined". partout ailleurs. Tout commentaire apprécié.

Modifier [copié des commentaires]: essayé ...

$.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); 
}) ;

Le premier journal est correct, le second n'est pas défini.

Modifier [copié de la réponse]:

  

effectivement les deux méthodes ont travaillé

     

la chose intéressante est que mon   demande était dans une fonction et j'ai essayé   accéder à ma variable globale droite   après la demande dans la même fonction

     

quand je l'ai accédé en dehors de la fonction   cela a fonctionné comme un charme

Était-ce utile?

La solution

Si votre code réel est structuré de la sorte, vous ne pourrez pas accéder aux données qui n'ont pas encore été définies . . Le simple fait que votre $. GetJSON () soit supérieur à console.log () ne signifie pas que vous obtenez la réponse avant de consigner la valeur des données.

Donc, votre problème n’est pas l’étendue, mais le timing: introduisez un décalage côté serveur et votre solution risque également de planter.

Peut-être devriez-vous définir un indicateur si une réponse a été reçue:

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");
}

Autres conseils

Vous pouvez l'insérer dans un attribut du DOM (tel qu'un #ID) et le récupérer si nécessaire.

Voici une approche qui vous permet de définir la variable dans un $ (document) .ready () et de l’utiliser dans un autre $ (document) .ready (). myglobals est un objet d'espace de noms qui réduit sans doute les risques de collision entre votre variable globale et celle de quelqu'un d'autre, en particulier si vous l'appelez de manière plus intelligente que "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']);
});

Lien transitoire vers le code ci-dessus en jsbin.

$. getJSON déclenche une requête ajax (le mot clé dans le champ de la question est asynchrone). Votre variable n'est pas définie car elle n'a pas encore été définie, la réponse n'est pas terminée. D'autres personnes ont suggéré de déplacer votre console.log plus bas dans votre code, mais rien ne garantit qu'il sera utilisable à moins que votre logique ne soit synchronisée avec une fonction de rappel. $ .getJSON accepte une fonction de rappel comme l’un de ses paramètres.

$.getJSON( "myData.json", function( data ) {
    //Do whatever, this is a callback
    $.each( data, function(key, val) {
       //You can get even more specific like so
    });
});
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top