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

onreadystatechange y tiempo de espera

Estas en el tema de onreadystatechange y tiempo de espera en el foro de Frameworks JS en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 22/10/2007, 07:45
 
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 ;)
  #2 (permalink)  
Antiguo 18/05/2010, 19:44
 
Fecha de Ingreso: agosto-2009
Mensajes: 70
Antigüedad: 14 años, 8 meses
Puntos: 2
Respuesta: onreadystatechange y tiempo de espera

hola.. una sugerencia...

algo que simplificará mucho tus aplicaciones Ajax es la librería prototype, donde enviar una petición estan sencillo como:

function peticion() {
var snd = new Ajax.Request (url, {method: 'post', parameters: parameterList, onComplete: leerXML, onFailure: mostrarError});
}

function leerXML(r) {
var res = r.responseXML
/* aquí va el código q procesa el xml */
}

function mostrarError {
/*aquí notificas el error, o administras un camino alternativo */
}

La libería tiene solucionados los problemas de incompatibilidad entre navegadores, asique el comportamiento será igual en cualquier navegador,
y se descarga de acá: http://prototypejs.org/
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 19:27.