JQuery – Stocker la réponse ajax dans une variable globale

Je suis encore un peu un débutant sur jQuery et la scène ajax, mais j’ai une requête $ .ajax effectuant un GET pour récupérer certains fichiers XML (~ 6 Ko ou moins), mais pour la durée que l’utilisateur passe sur cette page, le contenu XML devrait pas / ne changera pas (cette conception que je ne peux pas changer, je n’ai pas non plus access au fichier XML à mesure que je le lis ailleurs). Par conséquent, j’ai une variable globale dans laquelle je stocke les données de réponse, et toute recherche ultérieure sur les données est effectuée sur cette variable, de sorte que plusieurs demandes ne doivent pas être effectuées.

Etant donné que le fichier XML peut augmenter, je ne suis pas sûr que ce soit la meilleure pratique, et également en arrière-plan Java, mes reflections sur les variables publiques globales sont généralement un non-non.

Donc, la question que je me pose est de savoir s’il existe une meilleure façon de procéder, et si cela pose des problèmes de mémoire si le fichier s’étend à une taille de fichier ridicule?

Je pense que les données pourraient être transmises à des fonctions de type getter / setter dans l’object xml, ce qui résoudrait mes problèmes de variables publiques globales, mais soulève toujours la question de savoir si je devrais stocker la réponse dans l’object lui-même.

Par exemple, ce que je fais actuellement est:

// top of code var xml; // get the file $.ajax({ type: "GET", url: "test.xml", dataType: "xml", success : function(data) { xml = data; } }); // at a later stage do something with the 'xml' object var foo = $(xml).find('something').attr('somethingElse'); 

Il n’y a pas d’autre moyen que de le stocker. La pagination de la mémoire devrait réduire les problèmes potentiels.

Je suggère au lieu d’utiliser une variable globale appelée «xml», faites quelque chose de plus comme ceci:

 var dataStore = (function(){ var xml; $.ajax({ type: "GET", url: "test.xml", dataType: "xml", success : function(data) { xml = data; } }); return {getXml : function() { if (xml) return xml; // else show some error that it isn't loaded yet; }}; })(); 

puis y accéder avec:

 $(dataStore.getXml()).find('something').attr('somethingElse'); 

Voici une fonction qui fait le travail très bien. Je n’ai pas pu obtenir la meilleure réponse ci-dessus pour travailler.

 jQuery.extend({ getValues: function(url) { var result = null; $.ajax({ url: url, type: 'get', dataType: 'xml', async: false, success: function(data) { result = data; } }); return result; } }); 

Ensuite, pour y accéder, créez la variable comme suit:

 var results = $.getValues("url ssortingng"); 

Cela a fonctionné pour moi:

 var jqxhr = $.ajax({ type: 'POST', url: "processMe.php", data: queryParams, dataType: 'html', context: document.body, global: false, async:false, success: function(data) { return data; } }).responseText; alert(jqxhr); // or... return jqxhr; 

Important à noter: global: false , async:false et Finalement responseText enchaîné à la requête $.ajax .

Vous n’avez rien à faire. J’ai rencontré le même problème avec mon projet. Ce que vous faites est de faire un appel de fonction dans le callback on success pour réinitialiser la variable globale. Tant que le javascript asynchrone est défini sur false, il fonctionnera correctement. Voici mon code. J’espère que cela aide.

 var exists; //function to call inside ajax callback function set_exists(x){ exists = x; } $.ajax({ url: "check_entity_name.php", type: "POST", async: false, // set to false so order of operations is correct data: {entity_name : entity}, success: function(data){ if(data == true){ set_exists(true); } else{ set_exists(false); } } }); if(exists == true){ return true; } else{ return false; } 

J’espère que cela vous aidera.

Votre problème peut ne pas être lié à une scope locale ou globale, mais uniquement au délai entre l’exécution de la fonction “succès” et le moment où vous essayez d’extraire des données de votre variable.

il y a des chances que vous essayiez d’imprimer le contenu de la variable avant que la fonction ajax “succès” ne soit déclenchée.

Vous pouvez trouver plus facile de stocker les valeurs de réponse dans un élément DOM, car elles sont accessibles globalement:

   

Cela a l’avantage de ne pas avoir à définir async sur false. De toute évidence, la pertinence dépend de ce que vous essayez d’atteindre.

  function getJson(url) { return JSON.parse($.ajax({ type: 'GET', url: url, dataType: 'json', global: false, async: false, success: function (data) { return data; } }).responseText); } var myJsonObj = getJson('/api/current'); 

Cela marche!!!

  function get(a){ bodyContent = $.ajax({ url: "/rpc.php", global: false, type: "POST", data: a, dataType: "html", async:false } ).responseText; return bodyContent; } 

J’ai vraiment eu du mal à intégrer les résultats de jQuery ajax dans mes variables au stade “document.ready” des événements.

L’ajax de jQuery se chargerait dans mes variables lorsqu’un utilisateur déclencherait un événement “onchange” d’une boîte de sélection après le chargement de la page, mais les données ne fourniraient pas les variables lors du premier chargement de la page.

J’ai essayé beaucoup, beaucoup, beaucoup de méthodes différentes, mais au bout du compte, c’est la méthode de Charles Guilbert qui a le mieux fonctionné pour moi.

Chapeau à Charles Guilbert! En utilisant sa réponse, je suis en mesure d’obtenir des données dans mes variables, même lorsque ma première page est chargée.

Voici un exemple de script de travail:

  jQuery.extend ( { getValues: function(url) { var result = null; $.ajax( { url: url, type: 'get', dataType: 'html', async: false, cache: false, success: function(data) { result = data; } } ); return result; } } ); // Option List 1, when "Cats" is selected elsewhere optList1_Cats += $.getValues("/MyData.aspx?iListNum=1&sVal=cats"); // Option List 1, when "Dogs" is selected elsewhere optList1_Dogs += $.getValues("/MyData.aspx?iListNum=1&sVal=dogs"); // Option List 2, when "Cats" is selected elsewhere optList2_Cats += $.getValues("/MyData.aspx?iListNum=2&sVal=cats"); // Option List 2, when "Dogs" is selected elsewhere optList2_Dogs += $.getValues("/MyData.aspx?iListNum=2&sVal=dogs"); 

Ran dans cela aussi. Beaucoup de réponses, pourtant, une seule simple et correcte que je vais vous fournir. La clé est de rendre votre appel $ .ajax..sync!

 $.ajax({ async: false, ... 

IMO vous pouvez stocker ces données dans la variable globale. Mais il vaudra mieux utiliser un nom ou un espace de noms plus unique:

MyCompany = {};


MyCompany.cachedData = data;

Et il est également préférable d’utiliser json à ces fins, les données au format json sont généralement beaucoup plus petites que les mêmes données au format xml.

Je suggère que la récupération de fichiers XML volumineux à partir du serveur soit évitée: la variable “xml” devrait être utilisée comme un cache , et non comme le magasin de données lui-même.

Dans la plupart des scénarios, il est possible d’examiner le cache et de voir si vous devez faire une demande au serveur pour obtenir les données souhaitées. Cela rendra votre application plus légère et plus rapide.

bravo, jrh.

Les réponses .get sont mises en cache par défaut. Par conséquent, vous n’avez vraiment rien à faire pour obtenir les résultats souhaités.

Je sais que le sujet est ancien mais je pensais que quelqu’un d’autre pourrait trouver cela utile. Selon le jquey.com

 var bodyContent = $.ajax({ url: "script.php", global: false, type: "POST", data: "name=value", dataType: "html", async:false, success: function(msg){ alert(msg); } }).responseText; 

aiderait à obtenir le résultat directement à une chaîne. Notez le .responseText; partie.