2009-11-06 75 views
9

我們的Web應用程序中的一個頁面大約每10秒鐘對新數據進行輪詢,使用jQuery的ajax()方法。我們通常有幾百個用戶同時查看此頁面,因此我們的服務器每秒接收幾個請求。負載不是任何問題。jQuery ajax()調用偶爾會導致XmlHttpRequest響應狀態爲0的錯誤

對於我們訪問者的一小部分,jQuery ajax()調用非常觸發它是錯誤事件。這些錯誤事件中的大部分都是明顯的錯誤(例如訪問者遇到網絡問題時的超時),但是這些錯誤事件中的一小部分我很難找到原因,而且我有點困惑。

我們連線了一個全球性的錯誤監聽像這樣

$.ajaxSetup({ 
    timeout: oursettings.timeout, 
    error: function(xhr, status, e){ 
     // error handling goes here 
    } 
}); 

錯誤的這個特定子集,jQuery是扔我們的"error"一個status。當XmlHttpRequest readystate的值爲4(意味着它是DONE)並且HTTP響應狀態在成功值之外(< 200>= 300)時,通過jQuery source code(特別是第3574行)讀取錯誤僅以此值拋出。 。

但是,當我們檢查XmlHttpRequest對象本身時,我們發現它的(HTTP響應)狀態爲0。根據XHR規範,當the "error flag is true"時應設置爲0的狀態。

這是我得到真的很困惑,但因爲the only other thing這對「錯誤標誌」的XmlHttpRequest的規範狀態是

完成狀態具有指示某種類型的網絡錯誤或相關聯的錯誤標誌流產。它可以是真或假,並具有假的初始值。

該規範沒有說明什麼屬性或這個錯誤標誌保留在哪裏(即它是否可用xhr.error?)。

所以我想我的問題歸結爲:這將是正確的我們的Ajax的錯誤處理代碼假設擊中我們的錯誤處理程序與"error"一個jQuery狀態和0一個xhr.status任何事件所引起只有通過「network error or abortion」?

是否有任何其他條件或任何其他人已經看到可能導致XmlHttpRequest readystate爲DONE (4)的HTTP響應狀態爲0?我希望能夠排除服務器端錯誤的任何可能性(因爲我們的服務器端日誌沒有顯示任何內容),並且改變錯誤處理邏輯以不將這種情況視爲致命錯誤(導致用戶看到一堆大紅色警報類型的錯誤消息)。

回答

4

我的猜測是,這是某種問題,請求永遠不會將它發送到服務器,因此沒有響應標頭,並顯示錯誤代碼,但連接已正確關閉,因此readystate的值爲4,即a防火牆問題或類似的東西。看看這個post看看我的意思。

+0

還有更多,請參閱http://stackoverflow.com/a/14507670/700206 – Lee

3

我們發現,在AJAX調用完成之前,用戶導航離開頁面(比如說,點擊後退按鈕)可能會導致此特定狀態碼。

+0

我們也一樣。有什麼辦法可以確定發生了什麼(即瀏覽器終止了Ajax請求,因爲頁面由於用戶導航而卸載)?檢查xhr.status == 0似乎有風險 – chadmyers

相關問題