javascript - mostrar - El navegador espera que se complete una llamada ajax incluso después de haber llamado a abortar(jQuery)
ejecutar funcion javascript antes de cargar la pagina (6)
Tengo algunas llamadas ajax (potencialmente) de larga duración que me gustaría cancelar si el usuario navega a otra página. Las siguientes llamadas al código jQuery abortan en todos los objetos XMLHttpRequest pendientes al navegar fuera de la página:
$.ajaxSetup({
beforeSend: function(xhr) {
$(window).bind(''beforeunload'', function() {
xhr.abort();
});
}
});
En un caso de prueba, forzo una espera de 10 segundos en la operación del lado del servidor que se está llamando. Usando Firebug, confirmé que el código anterior efectivamente causa que todas las llamadas ajax pendientes se detengan inmediatamente cuando hago clic en cualquier enlace en la página. Sin embargo, el navegador aún espera los 10 segundos completos antes de pasar a la página siguiente. IE parece exhibir el mismo comportamiento. ¿Es este un comportamiento conocido del navegador? ¿Hay algo que pueda hacer para permitir que el usuario salga de la página inmediatamente en esta situación? Gracias por adelantado.
¿Estás seguro de que estás utilizando una solicitud ascrona? Si el navegador bloquea durante toda la solicitud, está utilizando una solicitud síncrona (el parámetro asíncrono es falso)
Es posible que desee comprobar un extraño efecto secundario de abortar ()
Cuando se utiliza el método abort (), el evento readystatechange se activa en Explorer y Mozilla. Peor aún, readyState = 4, lo que significa que la secuencia de comandos promedio xmlhttp supone que los datos se han cargado correctamente. Esto puede dar efectos muy extraños.
documentado aquí:
http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_a_1.html
¡Gracias por tus respuestas! Resultó que estaba completamente equivocado acerca de que esto era un problema del navegador: el problema estaba en el servidor. ASP.NET serializa las solicitudes de la misma sesión que requieren el estado de la sesión, por lo que en este caso, la siguiente página no comenzó a procesarse en el servidor hasta que se completen las solicitudes iniciadas por ajax.
Desafortunadamente, en este caso, se requiere el estado de la sesión en el controlador http que respondió a las llamadas ajax. Pero el acceso de solo lectura es lo suficientemente bueno, por lo que marcando el controlador con IReadOnlySessionState en lugar de IRequiresSessionState, los bloqueos de sesión no se mantienen y el problema se soluciona.
Espero que esta información sea útil para otros.
El problema del servidor también es el caso con el servidor Apache / Php con el que estoy trabajando. Se eliminó session_start en un script que no lo necesitaba (AJAX) y todo está funcionando como se esperaba. ¡Gracias a Todd que señaló un problema similar!
Referencia a la respuesta aceptada:
http://improve.dk/optimizing-performance-programmatically-setting-readonlysessionstate/
Acerca de IRequiresSessionState
Lo que esto significa es que, para una sesión determinada, solo se puede ejecutar una solicitud al mismo tiempo. Cualquier otra solicitud, desde esa misma sesión, se bloqueará, esperando a que se lance la sesión.
Con respecto a la propia respuesta de Todd a esta pregunta ...
Acabo de tener este problema con PHP y la misma solución habría funcionado. Sin embargo, necesitaba la información en la sesión. Para los desarrolladores de PHP, puede llamar a session_write_close()
para cerrar y escribir su sesión en el medio de la solicitud. Esto liberará la sesión para las otras solicitudes.