• Jueves 18 de Abril de 2024, 14:46

Autor Tema:  Ajax Respuesta De Servidor Atrasada  (Leído 1856 veces)

Juano

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Ajax Respuesta De Servidor Atrasada
« en: Miércoles 13 de Septiembre de 2006, 00:54 »
0
Hola!

En la aplicacion que estoy realizando uso ajax para llenar unos <select> con datos.
Esos datos los jalo de una base de datos de sql server.
La parte de obtener los datos lo realizo con un script de asp.
La peticion y la devolucion de esos datos hasta la parte de la respuesta del script asp es correcta.
Ya que obtengo el resultado del script asp, ese resultado lo guardo en una cadena de javascript global.
Ya que tengo esa respuesta en la variable la proceso para agregar <options> al <select> que deseo.
Todo esto se ejecuta mediante un onchange de un <select>, a fin de llenar sus <select> dependientes.
Mi problema pasa en el codigo de la respuesta del XMLHTTPRequest., al principio inicializo la variable global de respuesta como una cadena vacia.

Entonces realizo el primer onchange, pero de respuesta, la variable trae la cadena vacia.
Vuelvo a cambiar el select, y la respuesta que me devuelve es la que supuestamente me debía devolver la primera vez; y así sucesivamente.
No se porque sucede pero como que la respuesta del servidor esta atrasada y me la da cuando hago otra petición.

Escribo mi código a continuación.
Esta es la funcion que se ejecuta en el onchange:
Código: Text
  1.  
  2. var respuesta=&#34;&#34;;
  3. function switch_Select(sorigen,sdestino,param,tabla)
  4. {
  5.   var i;
  6.   i=0;
  7.   var lorigen = sorigen.options[sorigen.selectedIndex].value;
  8.   var ldestino = document.getElementById(&#34;s&#34;+sdestino);
  9.   if(sdestino==&#34;request&#34;)
  10.     sdestino=&#34;fullname&#34;;
  11.   if(sdestino==&#34;respons&#34;)
  12.     sdestino=&#34;name&#34;;
  13.   origenajax(lorigen,sdestino,param,tabla);
  14.   ldestino.options.length=0;
  15.   ldestino.options[0]=new Option(&#34;--Seleccione--&#34;,0);
  16.   var arreglo=respuesta.split(&#34;:&#34;);
  17.   var arrlength= arreglo.length;
  18.   for(i=1;i&#60;arrlength;i++)
  19.     ldestino.options[i]=new Option(arreglo[i],arreglo[i]);
  20. }
  21.  
  22.  

Aqui esta como manejo el XMLHTTPRequest
Código: Text
  1.  
  2. function origenajax(id,col,param,tabla)
  3. {
  4.   XMLHttp=null;
  5.   try
  6.   {
  7.     XMLHttp=new ActiveXObject(&#34;Msxml2.XMLHTTP&#34;);
  8.   }
  9.   catch(e)
  10.   {
  11.     try
  12.     {
  13.       XMLHttp=new ActiveXObject(&#34;Microsoft.XMLHTTP&#34;);
  14.     }
  15.     catch(e)
  16.     {
  17.       XMLHttp=new XMLHttpRequest();
  18.     }
  19.   }
  20.   var url=&#34;sel.asp&#34;;
  21.   url+=&#34;?id=&#34;+String(id)+&#34;&t=&#34;+col+&#34;&p=&#34;+param+&#34;&ta=&#34;+tabla+&#34;&sid=&#34;+Math.random();
  22.   XMLHttp.onreadystatechange=stateChanged;
  23.   XMLHttp.open(&#34;GET&#34;,url,true);
  24.   XMLHttp.send(null);
  25. }
  26. function stateChanged()
  27. {
  28.   if(XMLHttp.readyState==4||XMLHttp.readyState==&#34;complete&#34;)
  29.     respuesta=XMLHttp.responseText;
  30. }
  31.  
  32.  

Agradezco de antemano los comentarios

Avalon

  • Miembro MUY activo
  • ***
  • Mensajes: 448
    • Ver Perfil
Re: Ajax Respuesta De Servidor Atrasada
« Respuesta #1 en: Miércoles 13 de Septiembre de 2006, 12:27 »
0
Hola!

Cuando se ejecuta esta parte

Código: Text
  1.   origenajax(lorigen,sdestino,param,tabla);
  2.   ldestino.options.length=0;
  3.   ldestino.options[0]=new Option(&#34;--Seleccione--&#34;,0);
  4.   var arreglo=respuesta.split(&#34;:&#34;);
  5.   var arrlength= arreglo.length;
  6.   for(i=1;i&#60;arrlength;i++)
  7.     ldestino.options[i]=new Option(arreglo[i],arreglo[i]);
  8.  

haces una llamada a la función origenajax pero tras hacer la petición al servidor, el resto del código sigue ejecutándose aún cuando el servidor no ha dado todavía una respuesta.

La solución del problema pasa por realizar el cambio del contenido de los <select> tras comprobar que el servidor ha enviado una respuesta satisfactoria

Código: Text
  1. function stateChanged()
  2. {
  3.   if(XMLHttp.readyState==4||XMLHttp.readyState==&#34;complete&#34;)
  4.     ...
  5. }
  6.  
  7.  


Espero que te sirva.

Salu2,
Avalon

Juano

  • Nuevo Miembro
  • *
  • Mensajes: 15
    • Ver Perfil
Re: Ajax Respuesta De Servidor Atrasada
« Respuesta #2 en: Miércoles 13 de Septiembre de 2006, 17:46 »
0
Efectivamente fue por eso.

El servidor no daba la respuesta cuando ya había llenado los selects con el otro codigo y por eso el valor que me devolvia era el anterior

Entonces la funcion donde lleno el select la mando llamar dentro del if del readyState=4 asi como lo mencionaste.

Gracias por tu ayuda!!