Javascript:xmlhttprequest随机陷入Ready State 1

时间:2010-12-09 18:12:53

标签: javascript xmlhttprequest readystate

我一直在研究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;
    }
}

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

对于那些偶然发现并需要一个具体代码示例的人,请转到此处。

我遇到了同样的问题,解决方法是重新使用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);