2013-07-23 57 views
1

我已經測試過這一點,它看起來像即使頁面卸載,異步操作完成,無論標籤是關閉還是標籤導航到新的url。然而,它所呼叫的服務器非常活潑。如果由window.onbeforeunload觸發,異步ajax查詢是否會完成?

在運行異步進程和關閉標籤頁的過程中,幕後過程是什麼?瀏覽器在什麼時候調用它,然後退出頁面已經啓動的異步過程?

+0

[發送AJAX到服務器beforeunload]的可能重複(http://stackoverflow.com/questions/14929832/send-ajax-to-server-beforeunload)。 –

回答

0

不能依賴於onbeforeunload和onunload服務器之間的異步調用的行爲。

我們有一個應用程序,它運行在我們的開發環境中的Apache服務器Windows上,以及Unix上的版本上。事實證明,當服務器被配置爲處理線程中的請求時(默認爲我們的Windows/dev盒),Ajax將始終完成;當它被配置爲處理進程中的請求時(默認爲我們的Unix/prod環境),它將始終取消!

會發生什麼情況是Ajax請求觸發,然後瀏覽器卸載該頁面,該頁面將關閉Ajax答覆的連接。我們建立了一個測試,Ajax調用會在服務器上執行4秒「睡眠」以避免任何時間問題。它看起來像一個線程後端,Apache沒有注意到客戶端關閉連接,直到它從「睡眠」返回後,而對於子進程後端,它立即中止了Ajax調用。

答案是在您的[before]卸載事件處理程序中使用同步請求。這將保持頁面打開,直到請求完成。這確實意味着當頁面切換/重新加載/返回時的額外延遲...

...並且您也不能保證下一頁頁面將看到該請求的結果 - 似乎某些瀏覽器將在觸發onunload事件之前獲取下一頁!但這是另一個問題的話題。

相關問題