Questo metodo è abbastanza affidabile, se il server è abbastanza veloce da rispondere. Però qualcosa a cui prestare attenzione. Se chiudi il browser e invii la richiesta AJAX all'evento di scaricamento, è molto probabile che la risposta non venga ripristinata dal server in tempo prima che l'oggetto della finestra venga distrutto. Quello che succede in questo caso (almeno con IE) è che orfana il tuo oggetto di connessione e non lo chiude correttamente fino a quando non viene raggiunto il timeout della connessione. Se il tuo server non ha la connessione keep-alive attivata, dopo aver chiuso 2 finestre (lasciando aperta un'altra finestra), le connessioni aperte al server saranno esaurite (per IE6-7, per IE8 - 6 windows) e non sarai in grado di aprire il tuo sito web fino a quando non verrà raggiunto il timeout della connessione.
Mi sono imbattuto in una situazione del genere prima che stavo aprendo una finestra popup che inviava una richiesta AJAX allo scaricamento, era molto affidabile, ma era afflitta dall'emissione sopra descritta, e ci è voluto davvero molto tempo per per rintracciarlo e capire cosa sta succedendo. Dopo ciò, ho fatto in modo che la finestra di apertura avesse lo stesso codice per chiamare il server, e su ogni scaricamento controllato per l'apertura e il codice lì eseguito se fosse presente.
Sembra che se si chiude l'ultima finestra del browser, IE distruggerà correttamente la connessione, ma se un'altra finestra è aperta, non lo farà.
P.S. E solo per commentare la risposta sopra, AJAX non è veramente asincrono. Almeno l'implementazione di JS non lo è. Dopo aver inviato una richiesta, il codice JS sta ancora aspettando la risposta dal server. Non bloccherà l'esecuzione del codice, ma dal momento che il server potrebbe impiegare un po 'di tempo per rispondere (o abbastanza a lungo per consentire a Windows di terminare l'oggetto della finestra di IE), probabilmente si verificherà il problema descritto in precedenza.
fonte
2010-08-29 19:24:18
Qualcuno ha provato questo con async disattivato? Immagino che ciò impedirebbe al browser di scaricare fino al ritorno della richiesta. –
Questo è corretto. Con async spento il browser attenderà la risposta dal server prima di scaricare la pagina. Questo aiuta con bug di Chrome, dove Chrome è molto inaffidabile quando si tratta di scaricare eventi e operazioni asincrone. Questo risolverà anche la connessione IE che ho descritto sopra. Ma sarà visibile all'utente. –
Vale la pena tenere d'occhio la nuova API Beacon con 'Navigator.sendBeacon' che consentirà un modo migliore per inviare in modo affidabile una richiesta asincrona al nostro server allo scaricamento: https://developer.mozilla.org/en-US/docs/Web/API/Navigator/sendBeacon – Wildhoney