2012-09-11 6 views
5

En mi aplicación cuando el usuario solicita un informe, se realiza una llamada jquery AJAX (utilizando .load()) a un archivo que realiza un gran número de crujidos y solicitudes mySQL. en general, toma de 5 a 6 segundos cargar y .ajaxStart() y .ajaxStop() se utilizan para mostrar un gif de carga durante la carga.La solicitud AJAX cancelada ralentiza la navegación subsiguiente

El problema:

Si un usuario hace clic en el botón 'Generar informe' y luego cambia de opinión e intenta desplazarse a otra página de la aplicación se bloquea, y no vaya a la nueva página para 5-6 segundos. A partir de la eliminación del gif de carga, puedo observar que .ajaxStop() se dispara inmediatamente cuando se intenta navegar a una página nueva, pero parece que la solicitud de ajax finaliza antes de que el navegador cargue la página siguiente.

¿Es este comportamiento normal? ¿Alguna sugerencia sobre cómo arreglar/reestructurar esto?

+0

¡Sólo pensé en comentar y decirte que no estás solo! Estoy teniendo este problema exacto. Desde el inspector de Chrome y Firebug, el navegador ha cancelado las solicitudes de red pendientes realizadas con AJAX y solo tiene la 'nueva' solicitud para la siguiente página como 'pendiente'. Sin embargo, todavía parece colgar durante unos buenos 5-10 segundos antes de que realmente decida irse. –

+0

Lo mismo aquí: el navegador siempre se retrasa hasta que se completa la solicitud ajax existente. Aunque la respuesta ya no es necesaria. – CoreyOConnor

+0

¿Está utilizando alguna biblioteca que agregue credenciales de OpenID a través de una solicitud entre dominios? – CoreyOConnor

Respuesta

0

Creo que .ajaxStop() solo cancela una solicitud de ajax si la devolución de llamada de beforeSend devuelve falso. En este caso, la llamada no se ha iniciado y el servidor no ha recibido una solicitud. Una vez que la solicitud ha sido enviada al servidor, la página no tiene control sobre la solicitud hasta que regrese. La solicitud .ajaxStop() se desencadena cuando se navega fuera de la página porque se realizó la última llamada ajax, si se completó correctamente y, por lo tanto, finaliza la ejecución.

El evento ajaxStop también se desencadena si la última solicitud pendiente de Ajax se cancela al devolver el mensaje falso dentro de la función de devolución de llamada beforeSend.

Above es un extracto del sitio web de jquery api para el comando .ajaxStop(). Parece que una vez que se ha realizado la llamada y se ha enviado la solicitud, su servidor está completando la llamada aunque el usuario esté navegando hacia una página diferente. Si es una gran llamada, puede causar la demora que estás experimentando.

Espero que esto ayude.

+2

Creo que están más preocupados de que el navegador aún parezca estar esperando que regrese la solicitud AJAX, aunque intenten navegar a otra página. Sí, el servidor no puede detenerse y procesará alegremente la solicitud independientemente; pero el navegador debería haber detenido _caring_. No debería esperar la devolución de la solicitud. –

Cuestiones relacionadas