2011-09-04 60 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请求数量的限制,处理客户端事件(必须立即发送到服务器),服务器/网络宕机检测和恢复,多用户处理等。