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

Que logica tiene esto?

Estas en el tema de Que logica tiene esto? en el foro de Frameworks JS en Foros del Web. Hola a todos. Algo sucede en este codigo y no lo entiendo. Tengo 2 funciones en javascript : Esta primera funcion (buscarPersona) llama a la ...
  #1 (permalink)  
Antiguo 20/08/2008, 10:33
 
Fecha de Ingreso: julio-2008
Ubicación: Caldas, Antioquia, Colombia
Mensajes: 81
Antigüedad: 15 años, 10 meses
Puntos: 4
Que logica tiene esto?

Hola a todos. Algo sucede en este codigo y no lo entiendo.
Tengo 2 funciones en javascript:
Esta primera funcion (buscarPersona) llama a la segunda (ejecutarAjax).
Lo que me sucede es lo siguiente:
- si quito el alert (alert("Datos Cargados");), la variable val no se llena con los datos de valores y la funcion no realiza ninguna accion. Alguien sabe porque sucede esto??
Gracias... Aca le dejo el codigo de las dos funciones
Código:
function buscarPersona()
	{
		valores=ejecutarAjax('POST','buscarper.php','doc='+document.remisionequipos.doccliente.value+'&tdoc='+document.remisionequipos.tipodoc.value);
		alert("Datos Cargados");
		val=valores.split(',');
		
		if (val[0]=="0").........//etc, etc	
	}
Código:
function ejecutarAjax(metodo,pagina,parametros){
	var ajax=creaAjax();
	ajax.open (metodo, pagina, true);
	ajax.onreadystatechange = function() {
		if(ajax.readyState==1){
					
		}
		if(ajax.readyState==4)
		{
					//Cargo
			if(ajax.status==200)
			{
					valores=ajax.responseText;
					return valores;
					
			}else{ 
					if(ajax.status==404)
						{
								
						}else{
								  
						}
			}
		}
	}
	ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    ajax.send(parametros);
	return;		
}
  #2 (permalink)  
Antiguo 20/08/2008, 10:41
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Que logica tiene esto?

Hola:

Simplemente ajax devuelve los datos de forma asincrona, o sea cuando los tiene, y no de forma inmediata, y si no usas la alerta, no das tiempo a conseguir los datos del servidor.

Lo normal es procesar la respuesta ajax en la función que se asocia a readyStateChange.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 20/08/2008, 10:44
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: Que logica tiene esto?

El alert le da tiempo a ajax para entregar los datos. No deberías intentar acceder a esa variable hasta asegurarte de que ajax terminó sus procesos (sería lo más correcto) o podrías llamarla tras una pausa, usando un setTimeout.
Hola, Pepe, tiempo sin chocar!
  #4 (permalink)  
Antiguo 20/08/2008, 10:52
 
Fecha de Ingreso: julio-2008
Ubicación: Caldas, Antioquia, Colombia
Mensajes: 81
Antigüedad: 15 años, 10 meses
Puntos: 4
Respuesta: Que logica tiene esto?

Hola Gracias por la respuestas.

Yo quise crear la funcion ejecutarAjax para no tener que realizar una de estas por cada necesidad que tenga.

Existe alguna forma de estar seguro de que los datos estan listos??
O si me dan un consejo para no manejar tantas funciones... se les agradeceria.
no me gustaria usar el setTimeout porque si por alguna razon la consulta mas del tiempo que yo le ponga tampoco funcionaria.
Saludos
  #5 (permalink)  
Antiguo 20/08/2008, 11:09
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: Que logica tiene esto?

Podrías agregarle un parámetro adicional a esto:
Código PHP:
ejecutarAjax(metodo,pagina,parametros
Algo así:
Código PHP:
ejecutarAjax(metodo,pagina,parametros,callBack
y callBack es la función que llamás cuando readyState==4
  #6 (permalink)  
Antiguo 20/08/2008, 12:21
 
Fecha de Ingreso: julio-2008
Ubicación: Caldas, Antioquia, Colombia
Mensajes: 81
Antigüedad: 15 años, 10 meses
Puntos: 4
Respuesta: Que logica tiene esto?

Cita:
Iniciado por Panino5001 Ver Mensaje
Podrías agregarle un parámetro adicional a esto:
Código PHP:
ejecutarAjax(metodo,pagina,parametros
Algo así:
Código PHP:
ejecutarAjax(metodo,pagina,parametros,callBack
y callBack es la función que llamás cuando readyState==4
mmmm hola perdona mi ignorancia, pero me lo podes explicar??
  #7 (permalink)  
Antiguo 20/08/2008, 12:41
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: Que logica tiene esto?

Sería algo así:
Tenemos un php al que le pasaremos por post una fecha en el típico formato de fecha de los campos date de mysql y nos devolverá el timestamp correspondiente:
Código PHP:
<?php
list($anyo,$mes,$dia)=explode('-',$_POST['fecha']);
echo 
mktime (0,0,0,$mes,$dia,$anyo);
?>
Luego tenemos la página principal:
Código PHP:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<
html xmlns="http://www.w3.org/1999/xhtml">
<
head>
<
meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<
title>test</title>
<
script>
function 
http(){

    if(
typeof window.XMLHttpRequest!='undefined'){

        return new 
XMLHttpRequest();    

    }else{

        try{

            return new 
ActiveXObject('Microsoft.XMLHTTP');

        }catch(
e){

            
alert('Su navegador no soporta AJAX');

            return 
false;

        }    

    }    

    

}
function 
requestCallbackParam(url,callback,params){

    var 
H=new http();

    if(!
H)return;

    
H.open('post',url+'?'+Math.random(),true);

    
H.setRequestHeader('Content-Type','application/x-www-form-urlencoded');

    
H.onreadystatechange=function(){

        if(
H.readyState==4){

            
callback(H.responseText);

            
H.onreadystatechange=function(){}

            
H.abort();

            
H=null;

        }

    }

    var 
p='';

    for(var 
i in params){

        
p+='&'+i+'='+escape(params[i]);    

    }

    
H.send(p);

}
function 
escribir(texto){

vec=texto.split('-');


requestCallbackParam('timestamp.php',function(n){document.getElementById('fecha').innerHTML=n;},{'fecha':vec[2]+'-'+vec[1]+'-'+vec[0]});


}

window.onload=function(){
    
escribir('01-05-2008');
}
</script>
</head>

<body>
<div id="fecha"></div>
</body>
</html> 
Como ves, cuando se carga la página se llama a una función que dispara una petición AJAX. La petición se hace con una función llamada requestCallbackParam. En esta función, uno de los parámetros es la función que va a dispararse cuando ajax regrese los resultados de la petición, y que, en este caso usa como parámetros la propia respuesta AJAX (esa es la función que antes, en mi sugerencia, llamé callBack).
Más o menos así.

Última edición por Panino5001; 20/08/2008 a las 12:46
  #8 (permalink)  
Antiguo 20/08/2008, 13:27
 
Fecha de Ingreso: julio-2008
Ubicación: Caldas, Antioquia, Colombia
Mensajes: 81
Antigüedad: 15 años, 10 meses
Puntos: 4
Respuesta: Que logica tiene esto?

Gracias ahora si me quedo claro, lo probe y funciona perfecto.
No se si me equivoque pero creo que el problema que tenia al principio era que estaba retornando en una funcion "anidada", por decirlo asi tal vez por esto no funcionaba. Digo a esto a riesgo de equivocarme porque soy muy nuevo en este campo.

Gracias a todos por su colaboracion, aunque si alguien tiene algun otro aporte bienvenido.
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 20:04.