浏览器在ajax请求后等待多长时间?

时间:2011-09-04 07:02:16

标签: ajax request connection-timeout

在服务器回答请求之前,浏览器在显示错误之前等待多长时间?这次可以无限制吗?

4 个答案:

答案 0 :(得分:71)

如果您使用的是jQuery $ .ajax调用,则可以设置timeout属性以控制请求返回超时状态之前的时间。超时设置为毫秒,因此只需将其设置为非常高的值。您也可以将其设置为0表示“无限制”,但在我看来,您应该设置一个较高的值。

注意:无限制为actually the default,但大多数浏览器都会触发默认超时。

当由于超时而返回ajax调用时,它将返回错误状态“timeout”,如果需要,您可以使用单独的case处理。

因此,如果你想设置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
        }
    }
});​

答案 1 :(得分:14)

是和否。是的,服务器可以这样做或被配置为这样做,没有浏览器(我不知道版本/分销商的具体细节)可能已启用超时。

有两种解决方案可以通过HTTP实现/模拟:

  • 如果这是一个长期运行的脚本很简单并且你在等待结果这不是要走的路,你应该像之前提到的海报那样做,并使用异步处理与服务器轮询结果,这将是一个更多确定解决方案。例如:来自图像处理器服务器端的缩略图脚本:用户上传图像,服务器立即返回200和“作业ID”。然后,客户端(javascript ^^)可以使用JobID来请求作业状态/结果。
  • 如果您的目标是在浏览器和服务器之间建立类似的实时连接(单向连接,一旦浏览器发出请求,不使用新请求就可以发送更多信息(ajax ^^)),这是称为长轮询/反向ajax,可用于通过http进行实时通信。有几种技术并行使用2个长轮询请求,因此一旦其中一个超时,第二个请求变为活动状态,第一个尝试重新连接。

答案 2 :(得分:3)

您能否详细解释一下您正在尝试实现的目标 - 您是否在服务器上运行了很长时间,是否要在本地计算机上更改设置,或者您是否想要在为大量用户管理它?

浏览器等待的时间取决于许多因素,例如发生超时的地方 - 它是在TCP级别,服务器还是本地浏览器?

如果您在服务器上有一个长时间运行的进程,并且您想要在之后更新网页,那么处理它的典型方法是异步运行长进程并在完成时通知客户端,例如:有一个调用服务器的ajax调用,或使用HTTP 1.1并向客户端提供通知流。

在任何一种情况下,仍然可以关闭连接,因此客户端仍然需要重新打开它。

答案 3 :(得分:2)

我发现,在正常(HTML页面)请求的情况下,浏览器在cca之后运行超时。 30秒这很重要,因为其他参与者可能会遵循它:代理,路由器(路由器在这个游戏中玩吗?我不确定)。我正在使用 4秒长服务器端延迟(如果没有任何内容发送到客户端),我的AJAX客户端立即执行另一个HTTP请求(我在本地网络上,没有互联网延迟)。 4秒足够长,不会因为常用的民意调查而使服务器和网络过载,并且对于这种情况来说足够短,当某个时候某个民意调查不属于客户端无法检测和处理的行时。

此外,还有其他问题彗星(长HTTP请求):浏览器对同时HTTP请求数量的限制,客户端事件的处理(必须立即发送到服务器),服务器/网络检测和恢复,多用户处理等。