【问题标题】:How long will the browser wait after an ajax request?ajax 请求后浏览器会等待多长时间?
【发布时间】:2011-11-10 00:02:36
【问题描述】:

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

【问题讨论】:

  • 不确定您使用的是什么,但是可以延长超时时间。到无限,我不知道。虽然我建议不要做无限时间。如果需要,您始终可以将其设置为 90 秒或稍长一些。但是,如果花费的时间超过 30 秒,则可能有更好、更快的方法来做某事。
  • +1 - 我也很好奇这个。我怀疑您需要担心客户超时。你无法控制这一点。谷歌搜索出现了这个。它基本上说服务器或浏览器都可以超时。所以我会选择所有浏览器的默认值都不会超过的东西。 support.microsoft.com/kb/813827
  • 调试时,有一次在ajax调用后出去吃午饭,回到浏览器仍在等待回复。我在调试器上单击了继续,浏览器收到了响应。不过我不认为这很重要,因为我正在调试
  • 我认为他正在尝试做反向 ajax...
  • 可能重复的“基于AJAX的在线聊天室”:stackoverflow.com/questions/1192375/…

标签: ajax request connection-timeout


【解决方案1】:

如果您使用 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
        }
    }
});​

【讨论】:

  • timeout 值设置为 0 会将 AJAX 超时设置为无限期(无限读取)。
  • @UmaShankar 我正在处理和你一样的问题,你找到解决办法了吗。
【解决方案2】:

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

虽然有两种解决方案可以通过 HTTP 实现/模拟这一点:

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

【讨论】:

    【解决方案3】:

    您能否详细解释一下您想要实现的目标 - 您是否在服务器上有一个长时间运行的进程,您是否只想更改本地计算机上的设置,或者您是否想通过某种方式来管理它?大量用户?

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

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

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2013-08-02
        • 1970-01-01
        • 1970-01-01
        • 2017-11-17
        • 1970-01-01
        • 2017-10-21
        • 2013-07-05
        • 1970-01-01
        • 2018-08-10
        相关资源
        最近更新 更多