JQuery: almacenamiento de la respuesta ajax en variable global

Todavía soy un novato en jQuery y la escena de Ajax, pero tengo una solicitud $ .ajax realizando un GET para recuperar algunos archivos XML (~ 6 KB o menos), sin embargo, durante el tiempo que el usuario pasa en esa página ese contenido XML debería no / no cambiaré (este diseño no puedo cambiar, tampoco tengo acceso para cambiar el archivo XML porque lo estoy leyendo desde otro lugar). Por lo tanto, tengo una variable global en la que almaceno los datos de respuesta, y cualquier búsqueda posterior en los datos se realiza en esta variable, por lo que no es necesario realizar varias solicitudes.

Dado el hecho de que el archivo XML puede boost, no estoy seguro de que esta sea la mejor práctica, y también provengo de un fondo de Java, mis pensamientos sobre las variables públicas globales generalmente son un no-no.

Entonces, la pregunta que tengo es si podría haber una mejor manera de hacerlo, y una pregunta sobre si esto causa problemas de memoria si el archivo se expande a un tamaño de archivo ridículo.

Me imagino que los datos podrían pasarse a algunas funciones tipo getter / setter dentro del objeto xml, lo que resolvería mis problemas globales de variable pública, pero aún plantea la pregunta de si debo almacenar la respuesta dentro del objeto mismo.

Por ejemplo, lo que hago actualmente es:

// 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'); 

No hay forma de evitarlo, excepto para almacenarlo. La búsqueda de memoria debería reducir los posibles problemas allí.

Sugeriría que en lugar de usar una variable global llamada ‘xml’, haga algo como esto:

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

luego acceda con:

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

Aquí hay una función que hace el trabajo bastante bien. No pude obtener la mejor respuesta anterior para que funcione.

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

Luego, para acceder a ella, crea la variable como sigue:

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

Esto funcionó para mí:

 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; 

Importante a tener en cuenta: global: false , async:false y finalmente responseText encadenado a la solicitud $.ajax .

No tienes que hacer nada de esto. Me encontré con el mismo problema con mi proyecto. lo que debes hacer es realizar una llamada a función dentro de la callback exitosa para restablecer la variable global. Siempre que tenga javascript asíncrono establecido en falso, funcionará correctamente. Aquí está mi código. Espero eso ayude.

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

Espero que esto te ayude .

Es posible que su problema no esté relacionado con ningún ámbito local o global, sino solo con el retraso del servidor entre la ejecución de la función “éxito” y el momento en que intenta extraer los datos de su variable.

es probable que intente imprimir el contenido de la variable antes de que se active la función de “éxito” de ajax.

Es posible que le resulte más fácil almacenar los valores de respuesta en un elemento DOM, ya que son accesibles globalmente:

   

Esto tiene la ventaja de no tener que configurar asincrónico en falso. Claramente, si esto es apropiado depende de lo que estás tratando de lograr.

  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'); 

¡¡¡Esto funciona!!!

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

Realmente tuve problemas para obtener los resultados de jQuery ajax en mis variables en la etapa de eventos “document.ready”.

El ajax de jQuery se cargaría en mis variables cuando un usuario activara un evento “onchange” de un cuadro de selección después de que la página ya se hubiera cargado, pero los datos no alimentarían las variables cuando la página se cargó por primera vez.

Probé muchos, muchos, muchos métodos diferentes, pero al final, fue el método de Charles Guilbert el que mejor funcionó para mí.

Felicitaciones a Charles Guilbert! Usando su respuesta, puedo obtener datos en mis variables, incluso cuando mi página se carga por primera vez.

Aquí hay un ejemplo del script de trabajo:

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

Se metió en esto también. Muchas respuestas, sin embargo, solo una simple y correcta que voy a proporcionar. ¡La clave es hacer que tu llamada $ .ajax … sincronice!

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

IMO puede almacenar esta información en una variable global. Pero será mejor usar un nombre de usuario o espacio de nombres más exclusivo:

MyCompany = {};


MyCompany.cachedData = data;

Y también es mejor usar json para estos fines, los datos en formato json suelen ser mucho más pequeños que los mismos datos en formato xml.

Sugeriría que se debe evitar obtener archivos XML grandes del servidor: la variable “xml” debería usarse como un caché , y no como el almacén de datos en sí mismo.

En la mayoría de los escenarios, es posible examinar el caché y ver si necesita realizar una solicitud al servidor para obtener los datos que desea. Esto hará que tu aplicación sea más ligera y más rápida.

vítores, jrh.

.get respuestas están en la memoria caché por defecto. Por lo tanto, realmente no necesita hacer nada para obtener los resultados deseados.

Sé que el hilo es antiguo, pero pensé que alguien más podría encontrarlo útil. De acuerdo con 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; 

ayudaría a obtener el resultado directamente a una cadena. Tenga en cuenta el texto .response; parte.