具有超时条件的 XMLHTTPRequest

Posted

技术标签:

【中文标题】具有超时条件的 XMLHTTPRequest【英文标题】:XMLHTTPRequest with a time-out condition 【发布时间】:2011-10-31 17:03:00 【问题描述】:

XMLHTTPRequest 中,如何使用超时条件,如果服务器在固定时间(例如 5 秒)内没有响应,那么它应该显示错误消息?

换句话说,请求应该等待 5 秒,如果服务器没有响应,那么它应该显示一条消息“超时。请稍后再试”。如果代码可以同时用于同步和异步,那就更好了。

我使用的以下代码没有超时条件。

function testXMLHTTP()

    if(window.XMLHttpRequest)
    
        xmlhttp = new XMLHttpRequest();
    
    else
    
        xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
    

    xmlhttp.onreadystatechange=function()
    
        if (xmlhttp.readyState==4 && xmlhttp.status==200)
        
            document.getElementById("myDiv").innerhtml=xmlhttp.responseText;
        
        else if(xmlhttp.readyState < 4)
        
            document.getElementById("myDiv").innerHTML="Loading...";
        
    

    xmlhttp.open("GET","abcd.php",true);
    xmlhttp.send();     

【问题讨论】:

看***.com/questions/1018705/… 我怀疑同步请求是否可行,因为 javascript 是单线程的。 【参考方案1】:

如果您能够为您的项目使用外部库,您可能会考虑:jQuery's ajax module 允许您为请求指定超时。在大多数浏览器(显然,IE8+ 除外)中,没有使用 XMLHTTPRequest 对象处理超时的内置方法,因此您需要使用 set a timeout 来在一段时间后检查请求的状态。 This answer to a similar question 更彻底地探索了该特定解决方案,但如果可以,我仍然建议使用 jQuery。

【讨论】:

【参考方案2】:

这是我为 ajax 轮询系统制作的 XHR 的干净超时解决方案:

function doRequest() 
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function() 
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200) 
            // Process request.
        
    
    xmlhttp.open("GET", "/your/script", true);
    xmlhttp.send();
    setTimeout(function() 
        if (xmlhttp.readyState < 4) 
            // Timeout !
            xmlhttp.abort();
        
    , 3000);

它的好处是您可以多次调用它,并且每次超时都保持独立。 (例如,您可以每秒调用一次此函数,三秒后只有第一个请求会超时)。

【讨论】:

以上是关于具有超时条件的 XMLHTTPRequest的主要内容,如果未能解决你的问题,请参考以下文章

等到满足条件或在javascript中传递超时

等待条件时terraform helm释放超时

条件渲染,使用超时 Invalid hook call React

如何检查条件,如果条件为真,则停止报价器并退出应用程序,如果条件不成立并且发生超时,则退出应用程序

具有自定义会话超时的 Spring Security [关闭]

具有超时、最大大小和连接池的 http 请求