【问题标题】:Javascript: xmlhttprequest randomly stuck at Ready State 1Javascript:xmlhttprequest 随机停留在就绪状态 1
【发布时间】:2010-12-09 18:12:52
【问题描述】:

我一直在研究一个 Windows 小工具(意思是“浏览器”是 Internet Explorer),它可以查询指定的子网地址以获取信息。现在,它有时会以相对较快的速度(大约每 5 秒)执行此操作,并且运行良好。但是,有时它会卡在就绪状态 1 并永远停留在那里。每当小工具尝试重做用于获取 xmlhttprequest 并从中获取信息的函数时,它将保持在状态 1。当打开小工具的多个实例然后关闭除一个之外的所有实例时,这很容易复制。那时,仍然打开的那个几乎总是会陷入这种状态。我觉得这可能与他们都访问同一个网站有关,或者可能只是与 xmlhttprequests 在传输过程中被停止并阻止另一个网站工作有关。下面是相关代码。

//Reference to this for the inner function
var me = this;
var request = new XMLHttpRequest();
request.onreadystatechange = onReadyStateChange;
var url = this.url;
//Make the URL random to prevent being cached
url += ("&a=" + ((new Date()).getTime()));
Trace(DEBUG_COMM, "Sase.updateStatus url: " + url);
request.open("GET", url, true);
request.send();   // fire off the request, calls httpRequestReadyStateChange as things continue
Trace(DEBUG_COMM, "Request sent" + request.readyState); 
function onReadyStateChange() {Trace(DEBUG_COMM, "Sase.httpRequestReadyStateChange: state=" + request.readyState);
    if (4 == request.readyState) {
        Trace(DEBUG_COMM, "Sase.httpRequestReadyStateChange: status=" + request.status);

        if (request.status == 200) {
            Trace(DEBUG_COMM, "retrieved html: " + request.responseText);
            var results = request.responseText;
            var resultsString = request.responseText.toString();
            Trace(DEBUG_COMM, "results String: " + resultsString);
            me.ParseStatusData(resultsString);
        }
        else {
            //me.commError(request.status);
        }

        request = null;
    }
}

【问题讨论】:

    标签: javascript xmlhttprequest readystate


    【解决方案1】:

    好吧,看来我想通了。我有一种感觉,这是一个未解决的请求,因为它仅在它的实例关闭时发生(这意味着如果其中一个在与服务器通信时关闭,它将永远保持通信,并且没有其他人可以访问服务器)和看来是这样。我在多个区域对代码进行了一些修改,基本上它归结为当小工具关闭时,它确保中止所有请求。这些请求现在是实例变量(以允许中止它们),但在每次需要它们时仍然是新的。

    【讨论】:

    • 您对发布修改并使其成为有价值的答案有何感想?
    • 相当不安,因为我已经将近 3 年没有访问过该代码了。
    【解决方案2】:

    对于那些偶然发现并需要具体代码示例的人,请看这里。

    我遇到了同样的问题,解决方案是重新使用 XMLHttpRequest 对象,以确保在发起新请求之前取消任何先前的请求。如果您希望有多个 AJAX 请求飞来飞去,这将不起作用,但在我的情况下,触发一个新请求意味着不再需要最后一个请求。

    我页面上的所有请求都通过相同的 XMLHttpRequest 包装方法,看起来像这样;

    //Declare the XMLHttpRequest object to be re-used
    var global_xHttpRequest = null;
    
    function xmlHttpHandler(type, params, complete, postData) {
    
       //Prevents an issue where previous requests get stuck and new ones then fail
       if (global_xHttpRequest == null) {
           global_xHttpRequest = new XMLHttpRequest();
       } else {
           global_xHttpRequest.abort();
       }
    
       //Parse out current URL
       var baseURL = window.location.host;
       var svc = "https://" + baseURL + "/processAction?";
    
       var url = svc + params;
    
       global_xHttpRequest.open(type, url, true);
    
       //Add the callback
       global_xHttpRequest.onreadystatechange = complete;
    
       global_xHttpRequest.send(postData);
    }
    

    可以这样使用:

       xmlHttpHandler("GET", params, completeFnc);
    

    【讨论】:

      猜你喜欢
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 2020-09-13
      • 1970-01-01
      • 2012-12-14
      • 1970-01-01
      相关资源
      最近更新 更多