2012-02-07 6 views
6

Continuando con JQuery - Storing ajax response into global variabledatos de tienda ajax en una variable global

solución aceptada de alguna manera no funciona para mí.

$(document).ready(function() { 
    var dataStore = (function(){ 
     var xml; 

     $.ajax({ 
      type: "GET", 
      url: "/?do=getcontentadm1n&category=homepage", 
      dataType: "json", 
      success : function(data) { 
         xml = data.html; 
       alert(xml); // WORKS 
        } 
     }); 

     return {getXml : function() 
     { 
      if (xml) return xml; 
     }}; 
    })(); 

    var somevar = dataStore.getXml(); 

    alert(somevar); // UNDEFINED 
}); 

¿Hay alguna otra solución?

Gracias.

Respuesta

11

Está vacío porque en el momento getXml se llama, la petición Ajax no ha terminado, recuerde ajax es asíncrona. Una manera de conseguir alrededor de él es para forzarlo a ser sincrónica:

 $.ajax({ 
      async: false, 
      type: "GET", 
      url: "/?do=getcontentadm1n&category=homepage", 
      dataType: "json", 
      success : function(data) { 
         xml = data.html; 
       alert(xml); // WORKS 
        } 
     }); 

respuesta a comentar:

quiero realizar AJAX onclick, a continuación, almacenar data.html para otros eventos de ratón

var dataStore = (function(){ 
    var html; 
    function load(){ 
      $.ajax({ 
       async: false, 
       type: "GET", 
       url: "/?do=getcontentadm1n&category=homepage", 
       dataType: "json", 
       success : function(data) { html = data.html; } 
      }); 
    } 
    return { 
     load : function() { 
      if(html) return; 
      load(); 
     }, 
     getHtml: function(){ 
      if(!html) load(); 
      return html; 
     } 
    } 
})(); 

$(element1).click(function(){ 
    dataStore.load(); 
}); 

$(element2).click(function(){ 
    var html = dataStore.getHtml(); 
    // use html 
}); 
+0

Efectivamente. ¿Qué tal si evitamos la función en variable? –

+0

no entiendo su pregunta, ¿puede ser más específico? – ggreiner

+0

Sin este "var dataStore = (function() {". Quiero realizar AJAX onclick, y luego almacenar data.html para otros eventos del mouse. –

2

La llamada ajax es asincrónica. Es probable que ya no haya finalizado la ejecución cuando se llama:

var somevar = dataStore.getXml(); 
+0

Supongo. Preguntándose por qué el usuario aceptó la solución. –

0

@ggreiner: Olvídate de usar funciones en las variables. Estás confundiendo a otros usuarios.

Estoy un poco enojado, pero nada personal, NO hay soluciones en Internet disponibles para almacenar datos AJAX en los vars y usarlos en eventos.

hay necesidad de utilizar ninguna función en las variables como almacén de datos var = (function() {. Para ello, será servidores adicionales pide cada vez que necesite datos.

Este es el código para llamar ajax ONCE y utilizar su información para otros eventos, funciones. Ese fue el gran concierto de los usuarios 99% solicita este

$(document).ready(function() { 
    var html; // DEFINE VARS 
    var css; 
    var js; 

    $('.editbutton').live('click', function() { 
     $.ajax({ 
      async : false, // !!!MAKE SURE THIS ONE IS SET!!! 
      type : "GET", 
      url : "/?do=getcontent", 
      data : { category: category }, 
      dataType: 'json', 
      success : function(data) { 
       if (data.status == 'ok') { 
           html = data.html; // !!!STORE!!! 
           css = data.css; // !!!STORE!!! 
           js = data.js; // !!!STORE!!! 
       } 
       if (data.status == 'error') { 
        alert('ERROR!'); 
       } 
      } 
     }); 
    }); 

    // CALL ANY STORED VARIABLE FROM ANYWHERE 

    $('.otherbutton').live('click', function() { 
     alert(html); alert(css); alert(js); 
    }); 

}); 
+1

todos estos topes hacen que tu respuesta sea mucho más difícil de tomar en serio. Además, te equivocas acerca de que "esto requerirá solicitudes adicionales del servidor cada vez que necesites datos", leer el código nuevamente y entenderlo. Solo hace una solicitud. Con respecto a esta solución, es incorrecta. ¿Qué sucede si el usuario hace clic en '.otherbutton' antes de hacer clic en' editbutton'. En ese caso, los datos no se han cargado, un d será nulo. – ggreiner

+1

¿Por qué no hiciste 1 año para publicar un comentario? –

1

bien esta es mi primera respuesta, pero aquí va.

estoy dale que dale mi cabeza contra este problema yo mismo y aprendí esto.

Cuando define una variable fuera de una función, se agrega automáticamente al objeto 'ventana'.

por lo que si hacemos esto:

var myValue; 
    function setValue() 
    { 
     myValue = "test"; 
    } 
    // Assuming setValue() has been run 
    function getValue() 
    { 
     alert(window.myValue); // yup, it's "test" 
    } 

Así que si utilizamos este conocimiento para almacenar $ .ajax datos en una variable que irá como este.

var xml; 

    $.ajax({ 
     type: "GET", 
     url: "/?do=getcontentadm1n&category=homepage", 
     dataType: "json", 
     success : function(data) { 
      window.xml = data; 
     } 
    }); 

    alert(window.xml); 

creo que esto se aclarará bastante mucho para muchas personas y llegar a su respuesta. Gracias por leer mi respuesta y la fuente: http://snook.ca/archives/javascript/global_variable

EDIT: Como se menciona en el comentario anterior, esto sólo funciona cuando async = false.

+1

esto no funciona con async. solo donde async = falso; –

0

Solo use una palabra clave 'async:false' Ajax y no use var para hacer una respuesta Global.