2009-06-02 11 views
25

Ho alcune chiamate ajax (potenzialmente) di lunga durata che vorrei interrompere se l'utente naviga verso un'altra pagina. Le seguenti chiamate codice jQuery abort su tutti gli oggetti XMLHttpRequest in sospeso su di uscire dalla pagina:Il browser attende il completamento della chiamata ajax anche dopo la chiamata (jQuery)

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

In un banco di prova, forzo 10 secondi di attesa sul funzionamento del server-side di essere chiamato. 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.

+0

Che aspetto ha la chiamata Ajax? – epascarello

risposta

27

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.

+2

Ho avuto un tale mal di testa con questo, grazie mille! – Pablo

+0

Hai qualche riferimento che spiega questo in maggior dettaglio? – Phil

+0

@Phil, ho trovato ulteriori informazioni su questo problema con ASP.NET qui: http://johnculviner.com/asp-net-concurrent-ajax-requests-and-session-state-blocking/ –

2

Sei sicuro di utilizzare una richiesta asincrona? Se il browser blocca durante l'intera richiesta, si utilizza una richiesta sincrona (parametro asincrona è false)

+0

Il server sta effettivamente bloccando la navigazione perché la pagina in cui vuole navigare utilizza la stessa sessione della richiesta AJAX in esecuzione e in attesa della sessione. – grantwparks

3

Si potrebbe voler controllare un effetto strano lato del abort()

Quando il metodo abort() viene utilizzato, l'evento readystatechange viene attivato 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

1

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 evidenziato un problema simile!

9

Per quanto riguarda la propria 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 è possibile chiamare session_write_close() per chiudere e scrivere la sessione nel mezzo della richiesta. Ciò libererà la sessione per le altre richieste.

+1

Grazie mille. Non sapevo nemmeno che la sessione fosse trattenuta dal server per la richiesta accidentale fino a ora per non parlare di session_write_close(). Non ha tutto senso. –

+1

Salvato il giorno .. Grazie amico ... –

+0

@acdameli dovrei chiamare session_write_close() nelle mie funzioni che sta causando il problema o quello che ha chiamato più tardi –

0

Riferimento alla risposta accettata:

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

Chi IRequiresSessionState

Ciò significa che, per una determinata sessione, solo una richiesta può eseguire contemporaneamente. Qualsiasi altra richiesta, da quella stessa sessione, verrà bloccata, in attesa della pubblicazione della sessione

+0

Mentre questo link può rispondere alla domanda, è meglio includere le parti essenziali della risposta qui e fornire il link per riferimento. Le risposte di solo collegamento possono diventare non valide se la pagina collegata cambia. – Rajesh

Problemi correlati