Foros del Web » Programando para Internet » Javascript » Frameworks JS »

Problema: variable fuera de una función ajax

Estas en el tema de Problema: variable fuera de una función ajax en el foro de Frameworks JS en Foros del Web. Saludos gente, una ves más acudo a ustedes por que no puedo modificar el valor de una variable que no esta dentro la funcion onreadystatechange ...
  #1 (permalink)  
Antiguo 03/05/2011, 12:15
 
Fecha de Ingreso: enero-2009
Mensajes: 8
Antigüedad: 15 años, 10 meses
Puntos: 0
Pregunta Problema: variable fuera de una función ajax

Saludos gente, una ves más acudo a ustedes por que no puedo modificar el valor de una variable que no esta dentro la funcion onreadystatechange de ajax, ya que esta variable la necesito ocupar después para otras validaciones dentro de mi script. el cual es el siguiente:
Código Javascript:
Ver original
  1. function nuevoAjax()
  2. {  
  3.     var xmlhttp=false;  
  4.     try  
  5.     {  
  6.         xmlhttp=new ActiveXObject("Msxml2.XMLHTTP");  
  7.     }
  8.     catch(e)
  9.     {  
  10.         try
  11.         {  
  12.             xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");  
  13.         }  
  14.         catch(E) { xmlhttp=false; }
  15.     }
  16.     if (!xmlhttp && typeof XMLHttpRequest!='undefined') { xmlhttp=new XMLHttpRequest(); }  
  17.  
  18.     return xmlhttp;  
  19. }
  20. var store;
  21. function setstore(dat){
  22.     store = dat
  23.     }
  24. var Ajax=nuevoAjax();
  25.     Ajax.open("POST","test.xml", true);
  26.     Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  27.     Ajax.send('do=c');  
  28.     Ajax.onreadystatechange=function()
  29.     {
  30.     if (Ajax.readyState==4 && Ajax.status == 200){
  31.         Respuestas=Ajax.responseXML;
  32.         Comprobacion = Respuestas.getElementsByTagName("test")[0].childNodes[0].data;
  33.         setstore(Comprobacion);
  34.  
  35.         }
  36.    
  37.     }
  38. alert(store)
Y cuando alerto a store me muestra undifinied , según yo la variable store es de tipo global.

Espero sus comentarios... Mil gracias de antemano.
  #2 (permalink)  
Antiguo 03/05/2011, 14:13
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Problema: variable fuera de una función ajax

lee este articulo sobre ámbito de las variables
  #3 (permalink)  
Antiguo 03/05/2011, 19:33
Avatar de Sotelio  
Fecha de Ingreso: mayo-2011
Ubicación: Santiago de Chile
Mensajes: 68
Antigüedad: 13 años, 6 meses
Puntos: 21
Respuesta: Problema: variable fuera de una función ajax

Hola,

No sé exactamente cuál es el problema, pero si propones el código así, la ejecución de la llamada ajax se ejecuta, y mientras, se ejecuta el alert(store) y luego la llamada ajax termina de ejecutarse. Ahí recién asigna el valor a store.

Por lo tanto, store no tendrá valor cuando el alert lo muestra.

Por otro lado, debes verificar que la asignación o el resultado de la llamada ajax sea correcto, haciendo un alert dentro del if:

Código Javascript:
Ver original
  1. if (Ajax.readyState==4 && Ajax.status == 200){
  2.   alert(Respuestas.getElementsByTagName("test")[0].childNodes[0].data);
  3. }

Para estar seguro que estás asignándole un valor correcto.

Sotelio
  #4 (permalink)  
Antiguo 04/05/2011, 00:37
 
Fecha de Ingreso: enero-2009
Mensajes: 8
Antigüedad: 15 años, 10 meses
Puntos: 0
De acuerdo Respuesta: Problema: variable fuera de una función ajax

Gracias por tu respuesta, de antemano agradezco tu comentario y te hago saber que si coloco un alert detro del if si me muestra la informacion que necesito .. Pero sigo sin entendere la manerea de que esto funcione adecuadamente, espero mas comentarios ola manera correcta de hacer funcionar esto.
  #5 (permalink)  
Antiguo 04/05/2011, 00:38
 
Fecha de Ingreso: enero-2009
Mensajes: 8
Antigüedad: 15 años, 10 meses
Puntos: 0
De acuerdo Respuesta: Problema: variable fuera de una función ajax

Cita:
Iniciado por IsaBelM Ver Mensaje
lee este articulo sobre [URL="http://www.librosweb.es/javascript/capitulo4/ambito_de_las_variables.html"]ámbito de las variables[/URL]
Gracias por tu comentario. Lo reviso ok y gracias de nuevo
  #6 (permalink)  
Antiguo 04/05/2011, 07:53
 
Fecha de Ingreso: enero-2009
Mensajes: 8
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema: variable fuera de una función ajax

Compañeros he revisado la liga que IsabelM me proporciono en su respuesta pero según yo el ámbito de mi variable esta correcta ya que esta definida fuera de la función, y ya sea que se defina mediante var o no, es una variable global, solo que aun no entiendo que tengo que hacer entonces para que cambie su valor, ya intente meter todo dentro de una función, esto para primero llamar la función y esperar a que termine, y modifique el valor de la variable tmp y luego alertarla pero tampoco funciono, adjunto el código... Espero alguien me pueda ayudar y le estaré eternamente agradecido...
Código Javascript:
Ver original
  1. tmp = null;
  2.  
  3. function    settmp(data){
  4.     tmp = data;
  5.     };
  6.  
  7. function chkform(){
  8.     //var cliente =  GetEl("cliente"),correo=GetEl("correo"),factura=GetEl('factura'),password=GetEl('password'),password1=GetEl('password2');
  9.     var Ajax=nuevoAjax();
  10.     Ajax.open("POST","test.xml", true);
  11.     Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
  12.     Ajax.send('do=c');  
  13.     Ajax.onreadystatechange=function()
  14.     {
  15.     if (Ajax.readyState==4 && Ajax.status == 200){
  16.         Respuestas=Ajax.responseXML;
  17.         Comprobacion = Respuestas.getElementsByTagName("test")[0].childNodes[0].data;
  18.         settmp(Comprobacion);
  19.  
  20.         }
  21.    
  22.     }
  23. }
  24. chkform();
  25. alert(tmp)
  #7 (permalink)  
Antiguo 04/05/2011, 08:50
Avatar de chicohot20  
Fecha de Ingreso: mayo-2009
Mensajes: 388
Antigüedad: 15 años, 5 meses
Puntos: 43
Respuesta: Problema: variable fuera de una función ajax

Como haces una petición ajax, el valor que debe tomar la variable tmp tardará un poco, por que el servidor no te responderá inmediatamente. Pero si le pones el alert despues de settmp(Comprobacion); verás que si te imprime. Yo lo hice de otra manera, te dejo el codigo:
HTML
Código HTML:
Ver original
  1.     <head>
  2.         <title>Ejemplo</title>
  3.         <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.5/jquery.min.js"></script>
  4.         <script>
  5.         var tmp=null;
  6.         function settmp(data){
  7.             tmp = data;
  8.         };
  9.         function chkform(){
  10.                 $.ajax({
  11.                   url: 'ajax.php',
  12.                   data: 'doc=c',
  13.                   type: 'POST',
  14.                   contentType: "application/x-www-form-urlencoded; charset=utf-8",
  15.                   success: function(data){
  16.                     settmp(data);
  17.                     alert(tmp);
  18.                     $("#resultado").text("Dato recibido: "+data);
  19.                   }
  20.                 });
  21.         }
  22.         chkform();
  23.        
  24.     </script>
  25. </head>
  26.  <p id="resultado"><img src='load.gif' alt='' /> Cargando...</p>
  27.  
  28. </body>
  29. </html>

ajax.php
Código PHP:
Ver original
  1. <?
  2.     $boton=$_POST["doc"];          
  3.     echo $boton;
  4. ?>

Coméntanos si te funciona.
  #8 (permalink)  
Antiguo 04/05/2011, 08:50
Avatar de Sotelio  
Fecha de Ingreso: mayo-2011
Ubicación: Santiago de Chile
Mensajes: 68
Antigüedad: 13 años, 6 meses
Puntos: 21
Respuesta: Problema: variable fuera de una función ajax

@herrerao, lo básico de ajax es su sigla:

Asynchronous Javascript And Xml.

Lo primero significa asíncrono o asincrónico o como quieras traducirlo ja.

O sea, no tiene sincronía, y esto que significa? que puedes ejecutar, por ejemplo, 5 líneas de código javascript, y si una de ellas es una llamada ajax, podría terminarse de ejecutar después de la 5.

Y por qué sucede esto? primero porque así funciona ajax (aunque puedes obligarlo a que sea sincrónico o síncrono) y segundo porque cuando haces una llamada ajax estás haciendo una solicitud al servidor, que puede tomar milésimas de segundos o incluso segundos, dependiendo de la conexión del que visualiza el sitio o el archivo que programaste.

Entonces, en tu código tienes esto:

chkform(); // que ejecuta una llamada ajax, que demora algunas milésimas de segundo, cuando se ejecuta, asigna el valor a la variable tmp

alert(tmp) // que se ejecuta inmediatamente!!! sin esperar a la llamada ajax.

Se entiende ahora? :D

Saludos
Sotelio
  #9 (permalink)  
Antiguo 04/05/2011, 21:38
 
Fecha de Ingreso: enero-2009
Mensajes: 8
Antigüedad: 15 años, 10 meses
Puntos: 0
De acuerdo Respuesta: Problema: variable fuera de una función ajax


Muchisimas gracias por tu aporte y tiempo a mi pregunta, pero resumiendo veo que estas usando jquery, pero tengo la inquietud de hacerlo sin otros complementos, pero la otra manera que se me estaba ocurriendo es meter lavfuncion dentro de un while hasta que cambie el valor y ai detener su ejecucion ... Espero comemtarios, haa me falta probarlo con jquery y les aviso.... Gracias
  #10 (permalink)  
Antiguo 04/05/2011, 21:43
 
Fecha de Ingreso: enero-2009
Mensajes: 8
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema: variable fuera de una función ajax

Cita:
Iniciado por herrerao Ver Mensaje

Muchisimas gracias por tu aporte y tiempo a mi pregunta, pero resumiendo veo que estas usando jquery, pero tengo la inquietud de hacerlo sin otros complementos, pero la otra manera que se me estaba ocurriendo es meter lavfuncion dentro de un while hasta que cambie el valor y ai detener su ejecucion ... Espero comemtarios, haa me falta probarlo con jquery y les aviso.... Gracias
Sotelio... Gracias por tu apoyony tiempo, pero entoces, existe alguna manera de hacer lo que necesito o sera mejor crear una consulta ajax y validar todos los datos del servior junto con los proceos necesarios y ejecutar todo dentro del onreadystatechange... Espero comentario
  #11 (permalink)  
Antiguo 05/05/2011, 05:40
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Problema: variable fuera de una función ajax

Cita:
Iniciado por herrerao Ver Mensaje
Compañeros he revisado la liga que IsabelM me proporciono en su respuesta pero según yo el ámbito de mi variable esta correcta ya que esta definida fuera de la función
en tu primer código, se alertaba la variable antes de ejecutar la función, por lo que levantaba null. no se trataba de un problema con el scope, se trataba de aplicar lo que se expone en el último caso del articulo. aparte que invocabas la función desde la misma función, con lo que entraba en un bucle infinito. aparte de que también querías alertar la respuesta y no el parámetro que se le pasaba a la función cuando se era invocada, como pensé

examinando tu segundo código veo que has cambiado el procedimiento, pero también se alertará "null" puesto que el proceso es mas largo. de tal modo que mientras se hace la petición, se levanta la alerta

como no me gusta usar variables globales, mi opinión es almacenarla en un objeto global

Cita:
// definimos el objeto
var obj = {};

// se añade la propiedad
obj.variable = valor;


// le añadimos a un método
obj.fnc = function() {

};
esto no funcionará si el caso que planteas es un caso real. en caso que tu objetivo sea alertar la respuesta, inserta el alert después de recibir la respuesta

Última edición por IsaBelM; 05/05/2011 a las 05:53
  #12 (permalink)  
Antiguo 08/05/2011, 20:06
 
Fecha de Ingreso: enero-2009
Mensajes: 8
Antigüedad: 15 años, 10 meses
Puntos: 0
Respuesta: Problema: variable fuera de una función ajax

Ok... Amigos he obtado por hacer todas las comprbaciones dentro del objeto ajax y asi si me funciona.. Pero entonces para resumir.. Lo que yo queria hacer ... Era almacenar dentro de una variable el valor de la interaccion ajax, eso afuera del objeto ajax, la pregunta es es esto posible o solo estoy haciendo mi procedimiento mal.
  #13 (permalink)  
Antiguo 09/05/2011, 14:55
Avatar de IsaBelM
Colaborador
 
Fecha de Ingreso: junio-2008
Mensajes: 5.032
Antigüedad: 16 años, 5 meses
Puntos: 1012
Respuesta: Problema: variable fuera de una función ajax

Cita:
Iniciado por herrerao Ver Mensaje
Ok... Amigos he obtado por hacer todas las comprbaciones dentro del objeto ajax y asi si me funciona.. Pero entonces para resumir.. Lo que yo queria hacer ... Era almacenar dentro de una variable el valor de la interaccion ajax, eso afuera del objeto ajax, la pregunta es es esto posible o solo estoy haciendo mi procedimiento mal.
creo que ya está respondido
Cita:
examinando tu segundo código veo que has cambiado el procedimiento, pero también se alertará "null" puesto que el proceso es mas largo. de tal modo que mientras se hace la petición, se levanta la alerta
  #14 (permalink)  
Antiguo 09/05/2011, 15:35
 
Fecha de Ingreso: enero-2009
Mensajes: 8
Antigüedad: 15 años, 10 meses
Puntos: 0
De acuerdo Respuesta: Problema: variable fuera de una función ajax

Gracias amigos por el tiempo y darme cuenta de que tengo que hacer todalas validaciones necesarias adenteo del objeto de ajax.

Etiquetas: ajax, variables
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:30.