Passant json chargé à plusieurs fonctions

J’ai donc quelques fonctions qui fonctionnent pour faire plusieurs choses, mais j’ai besoin de passer un object json à travers la plupart d’entre elles. Les raisons pour lesquelles est la nécessité d’utiliser plusieurs jsons.

Je charge mon json en utilisant une fonction …

function LoadJSON(path) { $.getJSON(path, function() { }) .done(function(results) { return results; }) .fail(function() { alert("Error loading content."); }); } 

… à partir de là j’essaye de le charger dans une fonction …

 function LoadScene(button) { ... LoadButtons(LoadJSON('js/content.json'), id); // id is determined in code } 

… enfin j’essaie d’accéder aux données de la fonction dont j’ai le plus besoin …

 function LoadButtons(obj, id) { alert(obj['data']); } 

… J’ai réussi à le charger directement, sans fonction de chargement, ni à le passer d’une fonction à une autre. Toutefois, pour rendre mon code plus efficace, je dois séparer les éléments correctement.

Cependant, cela ne fonctionne pas: j’ai réussi à utiliser l’appel ajax dans la fonction LoadButtons. Toutefois, lorsque je le sépare en trois fonctions distinctes, cela ne fonctionne pas et l’alerte renvoie “indéfini”.

Une raison pour laquelle cela ne fonctionnerait pas comme je le fais?

Votre LoadJSON ne renverra jamais json car il est asynchrone. Par conséquent, LoadButtons(LoadJSON()) ne fonctionnera pas.

Vous devez passer une fonction de rappel pour le succès, par exemple:

 function LoadJSON(path, ondone) { $.getJSON(path, function() { }) .done(function(results) { if ($.isFunction(ondone)) ondone(results); }) .fail(function() { alert("Error loading content."); }); } function LoadDone(json) { .. work with json } // call with: LoadJSON('js/content.json', function(results) { LoadDone(results); }) //or LoadJSON('js/content.json', LoadDone ) 

ou utilisez la promesse directement:

 function LoadJSON(path, ondone) { return $.getJSON(path, function() { }) .fail(function() { alert("Error loading content."); }); } LoadJSON('js/content.json') .done(function(results) { LoadDone(results) }); 

Je voulais append quelques détails concernant le return ici:

 function LoadJSON(path) { $.getJSON(path, function() { }) .done(function(results) { return results; }) .fail(function() { alert("Error loading content."); }); } 

Au début, j’appendai qu’il n’y a pas de return dans LoadJSON, vous obtiendrez donc toujours la valeur null, mais “kind-of” est un retour, il se trouve dans le .done . Mais cela ne fait pas partie de LoadJSON car il se produit plus tard (car $.getJSON est asynchrone)

Donc ce qui se passe est:

  • LoadJSON démarre
  • Voit $ .getJSON et va: ok – je vais commencer l’appel ajax compte tenu des détails que vous avez fournis et retourne immédiatement
  • LoadJSON exits (sans instruction de retour, renvoie donc null
  • L’appel ajax se termine ensuite et touche le .done qui renvoie simplement le résultat au gestionnaire ajax jquery.