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


68

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


2
不确定您使用的是什么,但是可以延长超时时间。无限,我不知道。虽然我建议不要做无限的时间。如果需要,您可以随时将其设置为90秒或更长时间。但是,如果花费的时间超过30秒,那么可能会有更好,更快的方法来完成某件事。
马特

1
+1-我对此也很好奇。我怀疑您需要担心客户端超时。您对此无能为力。谷歌搜索结果。它基本上说服务器或浏览器都可能超时。因此,我选择了所有浏览器的默认值都不会超过的值。support.microsoft.com/kb/813827
mrtsherman 2011年

调试时,我曾在ajax调用后出去吃午饭,然后回到浏览器,仍在等待答复。我单击调试器上的继续,浏览器获取了响应。我不认为这很重要,因为我正在调试
Tin Can

我想他正试图做反向AJAX ...
安德烈·普埃尔

可能重复的“上线聊天室基于AJAX”:stackoverflow.com/questions/1192375/...
杰里米·汤普森

Answers:


79

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

注意:“无限制”实际上是默认设置,但大多数浏览器都有默认超时值。

当由于超时而返回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
        }
    }
});​

6
设置timeout值以0将AJAX超时设置为无限期(无限读取)。
约翰,

@UmaShankar我正在处理与您相同的问题,您是否找到任何解决方案。
尤德

14

是的,没有。是的,服务器可以执行此操作或将其配置为执行此操作,否则浏览器(我不知道版本/发行商的详细信息)可能未启用超时。

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

  • 如果这是一个长时间运行的简单脚本,而您等待结果的方式并非可行,则应按照前面提到的方法进行操作,并使用异步处理和服务器轮询来获得结果,这将是更加可靠的解决方案。例如:来自图像处理器服务器端的缩略图脚本:用户上传图像,服务器立即返回200和“作业ID”。然后,客户端(javascript ^^)可以使用JobID来请求作业状态/结果。
  • 如果您的目标是在浏览器和服务器之间建立实时连接(单向连接,一旦浏览器发出请求,则不使用新请求就无法发送进一步的信息(ajax ^^)),这称为长轮询/ reverse ajax,可用于通过http进行实时通信。有几种技术可以并行使用2个长轮询请求,因此一旦其中一个超时,第二个请求就会变为活动状态,而第一个尝试重新连接。

3

您能否进一步解释一下您要实现的目标-您在服务器上运行的时间是否很长,是否只想更改本地计算机上的设置,还是正在设法对其进行大量管理?用户?

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

如果您的服务器上有一个运行时间较长的进程,而您想在此后更新网页,则典型的处理方法是异步运行该较长的进程,并在完成后通知客户端,例如,通过ajax调用轮询服务器,或使用HTTP 1.1并向客户端提供通知流。

在这两种情况下,仍然有可能关闭连接,因此客户端仍然需要重新打开连接的能力。


2

我发现,在正常(HTML页面)请求的情况下,浏览器在cca之后会超时。30秒 这很重要,因为其他参与者很可能会跟随它:代理,路由器(路由器在此游戏中玩吗?我不确定)。我正在使用4秒钟的服务器端延迟(如果没有要发送给客户端的时间),并且我的AJAX客户端立即执行另一个HTTP请求(我在本地网络上,没有互联网延迟)。4秒的时间足够长,不会使频繁轮询的服务器和网络超负荷工作,并且对于某种情况来说足够短,因为某种原因,一个轮询从客户端无法检测和处理的行中掉了出来。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.