2011-09-04 58 views
55

服務器應答請求之前顯示錯誤之前,瀏覽器可以等待多久?這次可以無限制嗎?瀏覽器在ajax請求後等待多久?

+2

不知道你使用的是什麼,但是,是可以延長超時。爲了無限,我不知道。雖然我會建議不要無限的時間。如果需要,可以將其設置爲90秒或稍長一些。如果花費時間超過30秒,可能會有更好,更快的方式來做某件事。 – Matt

+1

+1 - 我也很好奇這件事。我懷疑你需要擔心客戶超時。你無法控制這一點。谷歌搜索出現了這個。它基本上說服務器或瀏覽器都可以超時。所以我會選擇所有瀏覽器的默認值不會超過的東西。 http://support.microsoft.com/kb/813827 – mrtsherman

+0

調試時,我曾經在ajax調用後出去吃午飯,然後回到瀏覽器仍在等待回覆。我點擊了我的調試器,瀏覽器拿起響應。我不認爲這一點很重要,因爲我正在調試 –

回答

62

如果您使用的是jQuery $ .ajax調用,則可以設置timeout屬性來控制請求返回並超時之前的時間長度。超時設置以毫秒爲單位,因此只需將其設置爲非常高的值即可。你也可以將它設置爲0來表示「無限」,但在我看來,你應該設置一個高值。

注意:無限制是actually the default但大多數瀏覽器都有默認的超時時間。

由於超時而返回ajax調用時,它將返回一個錯誤狀態「超時」,如果需要,您可以使用單獨的情況處理該錯誤狀態。

所以,如果你想設置爲3秒的超時,在這裏處理超時是一個例子:

$.ajax({ 
    url: "/your_ajax_method/", 
    type: "GET", 
    dataType: "json", 
    timeout: 3000, //Set your timeout value in milliseconds or 0 for unlimited 
    success: function(response) { alert(response); }, 
    error: function(jqXHR, textStatus, errorThrown) { 
     if(textStatus==="timeout") { 
      alert("Call has timed out"); //Handle the timeout 
     } else { 
      alert("Another error was returned"); //Handle other error type 
     } 
    } 
});​ 
+5

把timeout值設置爲0會將AJAX超時設置爲無限期(無限制讀取)。 – John

+0

@John甚至沒有設置它(讀取0是默認值)。 –

+0

我收到textStatus中的「錯誤」而不是「超時」 – UmaShankar

3

您能否更詳細地解釋一下您想要實現的目標 - 服務器上是否有長時間運行的進程,是否只需要在本地計算機上更改設置,或者您是否需要管理它爲大量的用戶?

瀏覽器等待多久取決於許多因素,例如發生超時的地方 - 它是在TCP級別,服務器還是本地瀏覽器?

如果你在服務器上有一個長時間運行的進程,並且你想以後更新網頁,處理它的典型方式是異步運行這個長進程並在完成時通知客戶端,有一個ajax調用來輪詢服務器,或使用HTTP 1.1並向客戶端發送通知流。

在這兩種情況下,連接仍然可能被關閉,所以客戶端仍然需要重新打開它的能力。

14

是的,沒有。是的服務器可以做到這一點,或配置爲這樣做,沒有瀏覽器(我不知道版本/分銷商的具體情況)可能會啓用超時。

有2個解決方案,雖然實現/模擬這種通過HTTP:

  • 如果這是簡單的一個長期運行的腳本,你在等待結果這個心不是要走的路,你應該做的,而不是作爲前面提到的海報,並使用異步處理與服務器輪詢的結果,這將是一個更確定的火災解決方案。例如:來自圖像處理器服務器端的縮略圖腳本:用戶上傳圖像,服務器亞馬遜返回200和「作業ID」。客戶端(javascript ^^)然後可以使用JobID來請求作業狀態/結果。
  • 如果你的目標是在瀏覽器和服務器之間有一個實時連接(單向連接,一旦請求由瀏覽器完成,沒有其他信息可以在沒有使用新請求的情況下發送(ajax ^^)),這是稱爲長輪詢/反向Ajax,可用於通過http進行實時通信。有幾種技術並行使用2個長輪詢請求,一旦其中一個超時,第二個請求變爲活動狀態,第一個嘗試重新連接。
+1

很好的回覆,謝謝 –

2

我發現,如果出現正常(HTML頁面)請求,瀏覽器會在cca後運行超時。 30秒。這很重要,因爲其他參與者可能會遵循它:代理,路由器(路由器在這個遊戲中玩嗎?我不確定)。我正在使用4秒長時間的服務器端延遲(如果沒有任何要發送到客戶端),我的AJAX客戶端立即執行另一個HTTP請求(我在本地網絡,沒有互聯網延遲)。 4秒足夠長,不會讓服務器和網絡經常出現輪詢,並且對於這種情況來說足夠短,當某個輪詢從客戶端無法檢測和處理的行中跳出時。另外,彗星(長HTTP請求)還存在其他問題:瀏覽器對同時HTTP請求數量的限制,處理客戶端事件(必須立即發送到服務器),服務器/網絡宕機檢測和恢復,多用戶處理等。