Pregunta

Todavía soy un poco novato en jQuery y la escena ajax, pero tengo una solicitud $.ajax que realiza 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 cambiará/no cambiará (este diseño no lo 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 de los datos se realiza en esta variable, por lo que no es necesario realizar múltiples solicitudes.

Dado el hecho de que el archivo XML puede aumentar, no estoy seguro de que esta sea la mejor práctica y, además, teniendo experiencia en Java, mis opiniones sobre las variables públicas globales son generalmente un no-no.

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

Me imagino que los datos podrían pasarse a algunas funciones de tipo getter/setter dentro del objeto xml, lo que resolvería mis problemas de variables públicas globales, 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');
¿Fue útil?

Solución

No hay manera de evitarlo, excepto para almacenarlo. paginación de memoria debería reducir los posibles problemas allí.

Yo sugeriría en lugar de utilizar una variable global llamada 'XML', hacer algo más 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 acceder a ella con:

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

Otros consejos

Esta es una función que hace el trabajo bastante bien. No podía obtener la mejor respuesta anterior al trabajo.

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

A continuación, para acceder a ella, crear la variable de esta manera:

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;

Es importante señalar: global: false, async:false y finalmente responseText encadenado a la solicitud $.ajax.

Usted no tiene que hacer nada de esto. Me encontré con el mismo problema con mi proyecto. lo que haces es hacer una llamada a una función dentro de la devolución de llamada en caso de éxito para restablecer la variable global. Siempre y cuando se consiguió JavaScript asíncrono se configura como False funcionará correctamente. Aquí está mi código. Espero que ayuda.

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 le ayuda.

Puede que le resulte más fácil el almacenamiento de los valores de respuesta en un elemento DOM, ya que son accesibles a nivel mundial:

<input type="hidden" id="your-hidden-control" value="replace-me" />

<script>
    $.getJSON( '/uri/', function( data ) {
        $('#your-hidden-control').val( data );
    } );
</script>

Esto tiene la ventaja de no tener que establecer asíncrono a falso. Es evidente que, si esto es apropiado depende de lo que estamos tratando de lograr.

su problema no podría estar relacionado con cualquier ámbito local o global para el caso simplemente la demora entre la función de servidor de "éxito" la ejecución y el tiempo que usted está tratando de sacar los datos de la variable.

Los más probable es que usted está tratando de imprimir el contenido de la variable antes de las ajax "éxito" fuegos de función.

        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;

  }

topó con esto también. Un montón de respuestas, sin embargo, sólo una simple correcto, que voy a proporcionar. La clave es hacer que su call..sync $ .ajax!

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

Realmente luchado con la obtención de los resultados de jQuery Ajax en mis variables al "document.ready" altura de los acontecimientos.

ajax de jQuery sería cargar en mi variables cuando un usuario activa una "onchange" caso de una caja de selección después de la página ya se había cargado, pero los datos no se alimentaría las variables cuando la página carga por primera vez.

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

Me quito el sombrero a Charles Guilbert! Haciendo uso de su respuesta, yo soy capaz de obtener datos en mi variables, incluso cuando mi página carga por primera vez.

Este es un ejemplo de la secuencia de comandos 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");

OMI puede almacenar estos datos en la variable global. Pero será mejor utilizar un nombre o el uso más único espacio de nombres:

MyCompany = {};

...
MyCompany.cachedData = datos;

Y también que es mejor usar JSON para estos fines, los datos en formato JSON es generalmente mucho más pequeños que los mismos datos en formato XML.

Yo sugeriría que ir a buscar grandes archivos XML desde el servidor se debe evitar:. La variable "xml" debería utilizado como un caché , y no como el almacén de datos en sí

En la mayoría de los escenarios, es posible examinar la memoria caché y ver si es necesario hacer una petición al servidor para obtener los datos que desea. Esto hará que su aplicación más ligero y más rápido.

aplausos, JRH.

.get respuestas se almacenan en caché por defecto. Por lo tanto usted realmente necesita hacer nada para conseguir los resultados deseados.

Sé que el hilo es viejo, pero pensé que alguien podría resultar útil. De acuerdo con la 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 de una cadena directa. Tenga en cuenta la .responseText;. parte

Al igual que en la respuesta anterior:

<script type="text/javascript">

    var wait = false;

    $(function(){
        console.log('Loaded...');
        loadPost(5);
    });

    $(window).scroll(function(){
      if($(window).scrollTop() >= $(document).height() - $(window).height()-100){
        // Get last item
        var last = $('.post_id:last-of-type').val();
        loadPost(1,last);
      }
    });

    function loadPost(qty,offset){
      if(wait !== true){

        wait = true;

        var data = {
          items:qty,
          oset:offset
        }

        $.ajax({
            url:"api.php",
            type:"POST",
            dataType:"json",
            data:data,
            success:function(data){
              //var d = JSON.parse(data);
              console.log(data);
              $.each(data.content, function(index, value){
                $('#content').append('<input class="post_id" type="hidden" value="'+value.id+'">')
                $('#content').append('<h2>'+value.id+'</h2>');
                $('#content').append(value.content+'<hr>');
                $('#content').append('<h3>'+value.date+'</h3>');
              });
              wait = false;
            }
        });
      }
    }
</script>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top