【问题标题】:AJAX (XmlHttpRequest) timeout length by browser浏览器的 AJAX (XmlHttpRequest) 超时长度
【发布时间】:2012-03-19 03:11:39
【问题描述】:

我一直在网上搜索,试图找到一个直接的答案。有谁知道浏览器 ajax 请求的默认超时长度?如果它改变了,也按版本?

【问题讨论】:

    标签: ajax xmlhttprequest


    【解决方案1】:

    我不认为浏览器对 AJAX 有超时,只有同步或异步请求;同步 - 首先冻结 JavaScript 执行,直到请求返回, 异步 - 不冻结 JavaScript 执行,它只是将请求从执行流程中取出,如果您有回调函数,它将与正在运行的脚本并行执行该函数(类似于线程)

    **sync flow:**
    
    running JS script
         |
        ajax
    (wait for response)
         |
    execute callback 
         |
    running JS script
    
    
    
    
     **async flow:**
    
     running JS script
         |
        ajax  --------------------
         |                       |
     running JS script       execute callback
    

    【讨论】:

    • Chrome 似乎确实有超时。即使我将 ajax 调用超时设置为 900000(15 分钟),请求也会在 1 分钟后超时,长时间运行的请求状态为“已取消”。
    • M87 在这个线程上的回答也证实了这一点:stackoverflow.com/questions/42798882/…
    【解决方案2】:

    根据规范,超时值默认为零,这意味着没有超时。但是,您可以在 XHR.timeout 属性上设置超时值;该值以毫秒为单位。

    来源:

    http://www.w3.org/TR/2011/WD-XMLHttpRequest2-20110816/#the-timeout-attribute http://msdn.microsoft.com/en-us/library/cc304105(v=vs.85).aspx

    【讨论】:

    • 但是规范没有涵盖一个潜在的超时。来自第二个链接:If you set an XMLHttpRequest time-out value that is larger than the network stack's time-out value, the network stack will time out first and the ontimeout event will not be raised.
    【解决方案3】:

    浏览器确实有一个超时值,行为取决于浏览器 chrome 的超时值为 5 分钟,5 分钟后它会重新发送 ajax 调用

    【讨论】:

    • 10秒后我的超时..?
    【解决方案4】:

    我做了少量的测试。为了测试我加载了我的网站,停止了本地服务器,然后尝试了 AJAX 请求。我将 timeout 设置为 1000 毫秒之类的低值,直到我可以确保我的代码最少(您必须xhr.timeout 放在 open 之后和 之前 send )。

    一旦我开始工作,我最初的目标是确定允许的适当时间量,但是我很惊讶timeout 会被浏览器完全忽略的速度有多快。我的目标是在错误处理不再可行之前尝试确定最大超时可能。这意味着在这些相当短的时间跨度之后,您的超时处理程序脚本将根本无法工作。我发现的很可悲。

    • Chrome 60: 995ms, 996ms 将向控制台抛出一个肮脏的邪恶错误。
    • Firefox 52 ESR:约 3000 毫秒,鼠标位置或其他问题可能会导致在三秒左右或不到三秒内无响应。

    所以...

    xhr.open(method,url,true);
    xhr.timeout = 995;//REALLY short
    xhr.send(null);
    xhr.ontimeout = function ()
    {
     //Code will only execute if at or below *effective* timeouts list above.
     //Good spot to make a second attempt.
    }
    

    因此,如果您的timeout 设置为高于 995 毫秒,Chrome 将忽略您的代码并在您努力保持清洁的漂亮干净的空控制台上呕吐。 Firefox 也好不了多少,有些不可靠的请求会超时,超出了我的耐心,因此忽略了ontimeout 处理程序。

    【讨论】:

      猜你喜欢
      • 2010-11-04
      • 2018-08-10
      • 2011-02-06
      • 1970-01-01
      • 2012-09-22
      • 2011-08-13
      • 2012-04-11
      • 2014-08-22
      • 2017-03-13
      相关资源
      最近更新 更多