Il browser attende che la chiamata ajax venga completata anche dopo che è stata chiamata l’interruzione (jQuery)

Ho alcune chiamate ajax (potenzialmente) di lunga durata che vorrei interrompere se l’utente naviga su un’altra pagina. Le seguenti chiamate al codice jQuery si interrompono su tutti gli oggetti XMLHttpRequest in sospeso quando si naviga fuori dalla pagina:

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

In un caso di test, impongo un’attesa di 10 secondi sull’operazione dal lato server chiamata. Usando Firebug, ho confermato che il codice sopra riportato fa sì che tutte le chiamate ajax in sospeso si fermino immediatamente quando faccio clic su un collegamento qualsiasi nella pagina. Tuttavia, il browser attende ancora 10 secondi prima di passare alla pagina successiva. IE sembra mostrare lo stesso comportamento. Si tratta di un comportamento noto del browser? C’è qualcosa che posso fare consentire all’utente di allontanarsi dalla pagina immediatamente in questa situazione? Grazie in anticipo.

Grazie per le vostre risposte! Si scopre che ho sbagliato completamente sul fatto che si tratti di un problema del browser – il problema era sul server. ASP.NET serializza le richieste della stessa sessione che richiedono lo stato di sessione, quindi in questo caso, la pagina successiva non ha iniziato l’elaborazione sul server fino a quando quelle richieste avviate da ajax non sono state completate.

Sfortunatamente, in questo caso, lo stato della sessione è richiesto nel gestore http che ha risposto alle chiamate Ajax. Tuttavia, l’accesso in sola lettura è sufficiente, quindi contrassegnando il gestore con IReadOnlySessionState anziché IRequiresSessionState, i blocchi di sessione non vengono mantenuti e il problema viene risolto.

Spero che questa informazione si riveli utile agli altri.

Per quanto riguarda la risposta di Todd a questa domanda …

Ho appena avuto questo problema con PHP e la stessa soluzione avrebbe funzionato. Tuttavia avevo bisogno delle informazioni nella sessione. Per gli sviluppatori PHP puoi chiamare session_write_close() per chiudere e scrivere la tua sessione nel mezzo della richiesta. Ciò libererà la sessione per le altre richieste.

Potresti voler controllare uno strano effetto collaterale di abort ()

Quando viene utilizzato il metodo abort (), l’evento readystatechange viene triggersto in Explorer e Mozilla. Peggio ancora, readyState = 4, il che significa che lo script xmlhttp medio assume che i dati siano stati caricati correttamente. Questo può dare effetti molto strani.

documentato qui:

http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_a_1.html

Sei sicuro di utilizzare una richiesta asincrona? Se il browser si blocca durante l’intera richiesta, si sta utilizzando una richiesta sincrona (il parametro async è falso)

Il problema del server è anche il caso del server Apache / Php con cui sto lavorando. Rimosso il session_start su uno script che non ne aveva bisogno (AJAX) e tutto funziona come previsto. Grazie a Todd che ha sottolineato un problema simile!

Riferimento alla risposta accettata:

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

Informazioni su IRequiresSessionState

Ciò significa che, per una determinata sessione, solo una richiesta può essere eseguita contemporaneamente. Qualsiasi altra richiesta, da quella stessa sessione, si bloccherà, in attesa che la sessione venga rilasciata