2009-06-02 9 views
25

Tengo algunas llamadas ajax (potencialmente) de larga ejecución que me gustaría cancelar si el usuario navega a otra página. Las siguientes llamadas de código jQuery abortan en todos los objetos XMLHttpRequest pendientes al navegar fuera de la página:El navegador espera que se complete la llamada ajax incluso después de haber llamado al aborto (jQuery)

$.ajaxSetup({ 
    beforeSend: function(xhr) { 
     $(window).bind('beforeunload', function() { 
      xhr.abort(); 
     }); 
    } 
}); 

En un caso de prueba, fuerzo una espera de 10 segundos sobre el funcionamiento del lado del servidor que se llama. 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.

+0

¿Cómo es la llamada Ajax? – epascarello

Respuesta

27

Gracias por sus 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 los demás.

+2

¡Tenía tanto dolor de cabeza con esto, muchas gracias! – Pablo

+0

¿Tiene alguna referencia que explique esto en más detalles? – Phil

+0

@Phil, encontré más información sobre este problema con ASP.NET aquí: http://johnculviner.com/asp-net-concurrent-ajax-requests-and-session-state-blocking/ –

2

¿Estás seguro de que estás utilizando una solicitud de asychronous? Si el navegador bloquea durante toda la solicitud, que están utilizando una petición síncrona (parámetro asíncrono es falsa)

+0

El servidor en realidad está bloqueando la navegación porque la página a la que quiere acceder utiliza la misma sesión que la solicitud AJAX que se está ejecutando y reteniendo la sesión. – grantwparks

3

Es posible que desee comprobar un efecto secundario raro de abortar()

Cuando el método de aborto() se utiliza, el evento ReadyState Change 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

1

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!

9

En cuanto a la propia respuesta de Todd a esta pregunta ...

que acaba de tener este problema con PHP y la misma solución hubiera funcionado. Sin embargo, necesitaba la información en la sesión. Para desarrolladores de PHP, puede llamar al 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.

+1

Muchas gracias. Incluso no sabía acerca de la sesión mantenida por el servidor para la solicitud conccurent hasta ahora sin mencionar el session_write_close(). No todo tiene sentido. –

+1

Guardado el día ... Gracias amigo ... –

+0

@acdameli debería llamar a session_write_close() en mis funciones que está causando el problema o el que llamó más tarde –

0

referencia a la respuesta aceptada:

http://improve.dk/optimizing-performance-programmatically-setting-readonlysessionstate/

Sobre IRequiresSessionState

Lo que esto significa es que, para una sesión dada, sólo una solicitud puede ejecutar simultáneamente. Cualquier otra solicitud, desde esa misma sesión, se bloqueará, esperando a que se lance la sesión

+0

Mientras que este enlace puede responder la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcione el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. – Rajesh

Cuestiones relacionadas