71

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

4

4 回答 4

82

如果您使用 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
        }
    }
});​
于 2011-10-04T19:57:22.570 回答
14

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

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

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

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

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

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

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

于 2011-09-28T13:46:42.407 回答
2

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

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

于 2011-10-04T08:16:01.733 回答