Ver Mensaje Individual
  #1 (permalink)  
Antiguo 22/10/2007, 07:45
yannderrien
 
Fecha de Ingreso: junio-2003
Mensajes: 7
Antigüedad: 20 años, 10 meses
Puntos: 0
onreadystatechange y tiempo de espera

Hola a todos. A ver si consigo explicar mi problema, porque es un poco lioso.

Estoy haciendo una página web que envía una petición a un servlet, éste genera unos resultados que devuelve en xml. La página web que hacía la petición recibe esos resultados y los muestra en pantalla (en un div que hace las veces de desplegable, vamos, como si fuese un <select>).

La página en sí funciona bien, recibe los datos y los muestra sin producir errores.

El problema es que una petición pesada (la página puede hacer distintas peticiones a través de la misma función y el mismo servlet, pero sólo da el problema una petición de lista de usuarios) tarda en resolverse unos 5 segundos en firefox, mientras que con internet explorer tarda casi medio minuto.

Ahí está mi problema, ya que el servidor en sí apenas tarda en generar la respuesta.

¿Por qué tarda tanto un navegador y el otro no?


Haciendo pruebas, puse unas variables para ver cuantas veces saltaba onreadystatechange por cada estado. En Internet Explorer salta sólo, como mucho, una vez por cada estado (el estado 0 lógicamente es 0), mientras que por ejemplo, para el firefox, el estado 3 salta hasta 15 o 16 veces.

Es, además, en el estado 3, donde parece que se bloquea internet explorer (en cada estado pongo una etiqueta para indicar al usuario el momento del proceso en el que se encuentra).

El código en cuestión es:

_httpObject=getHTTPObject();
_httpObject.open("POST","mc_ajax?", true);
_httpObject.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
_httpObject.send("nombre=" + encodeURL(nombre)
+"&codigo=" + encodeURL(numEmpl)
+"&division=" + encodeURL(division)
+"&subdivision=" + encodeURL(subdivision)
+"&rpht=" + encodeURL(rpht)
+"&fechaini=" + encodeURL(fechaini)
+"&fechafin=" + encodeURL(fechafin)
+"&incidencia=" + encodeURL(incidencia)
+"&tipo=" + encodeURL(tipo));

_httpObject.onreadystatechange=function()
{
var readyState = _httpObject.readyState;

switch (readyState)
{
case 0:
case 1:
ref.showMsg("Iniciando peticion...");
break;
case 2:
case 3:
ref.showMsg("Recibiendo datos...");
break;
case 4:
ref.showMsg("Cargando listado...");
//... visualiza la información obtenida ...
[...]
break;
}
}

Donde
* getHTTPObject es la típica función para crear el objeto xmlhttp.

* ref.showMsg muestran un mensaje en pantalla, para informar en que estado se encuentra (para que esté informado el usuario por si la espera es larga).

* Los parámetros enviados en el send son para filtrar el resultado obtenido. En este caso, el problema surge cuando no se filtra o se tiene un número muy elevado de datos para recibir.

La verdad que no sé si es un problema de como trabaja el activex de iexplorer y sólo me queda aguantarme, o si se puede hacer algo. He probado a cambiar el método por get, el orden del onreadystatechange (por probar) pero siempre pasa lo mismo.

Si alguien puede echarme un cable o al menos decirme "eso es lo que hay", se agradecería, es al menos para salir de la duda y darlo por imposible ;)