IE中的XMLHTTPRequest ReadyState问题

XMLHTTPRequest ReadyState issue in IE

本文关键字:问题 ReadyState XMLHTTPRequest 中的 IE      更新时间:2023-09-26

从我的UI线程,我试图启动一个工作线程做XMLHTTPRequest。它在Chrome中工作得很好,但在IE 10中不起作用。在IE中,它总是给我ReadyState =1, Status=0和停止。在chrome的代码工作完美,如预期的那样。谁能告诉我,请什么可能是错误的,这里涉及到一个浏览器?

UI线程代码:
  if (typeof (Worker) !== "undefined") {
            var w = new Worker("worker.js");
            var now = new Date();
            w.postMessage({
                newid: ws.length,
                starttime: now
            });
下面是我的worker.js代码
this.onmessage = function ($event) {
var myid = 0;
var mystarttime = "";
var url = "http://rest-service.guides.spring.io/greeting";
myid = $event.data.newid;
mystarttime = $event.data.starttime;
var gotresponse = function () {
    var rs = new Response();
    if ((xhr.readyState == 4 || xhr.readyState == 3) && xhr.status == 200) {
        var result = JSON.parse(xhr.responseText);
        rs.id = myid;
        rs.starttime = mystarttime;
        rs.data = result.content;
        rs.endtime = new Date();
    }
    else {
        rs.err = 'Error.   ReadyState: ' + xhr.readyState + ' Status:' + xhr.status;
    }
    self.postMessage(rs);
    self.close();
};
var timedout = function () {
    var rs = new Response();
    rs.err = 'Error TIMEOUT occurred : ' + xhr.statusText + '  ReadyState: ' + xhr.readyState + ' Status:' + xhr.status + ' E: ' + e + ' Msg:' + e.message;
    rs.starttime = mystarttime;
    rs.data = result.content;
    rs.endtime = new Date();

    self.postMessage(rs);
    self.close();
};
function Response(name, gender) {
    this.id = 0;
    this.data = "";
    this.starttime = new Date();
    this.endtime = new Date();
    this.err = "";
}
var xhr = new XMLHttpRequest();
getSpecData();
function getSpecData() {
    try {
        xhr.onload = function () { console.log(this.responseText); };
        xhr.open('GET', url, false);
        xhr.timeout = 5000;
        xhr.setRequestHeader('Content-Type', 'application/json');
        //xhr.setRequestHeader('Authorization', 'Basic ' + btoa('sk:pwd'));
        xhr.ontimeout = timedout;
        xhr.onreadystatechange = gotresponse;
        //xhr.withCredentials = true;
        xhr.send();
    } catch (e) {
        var rs = new Response();
        rs.err = 'Error occured : ' + xhr.statusText + '  ReadyState: ' + xhr.readyState + ' Status:' + xhr.status + ' E: ' + e + ' Msg:' + e.message;
        self.postMessage(rs);
        self.close();
    }
}

};

我的意思是,在readystatechange事件发生后添加超时:

var gotresponse = function () {
    setTimeout(function(){
    var rs = new Response();
    if ((xhr.readyState == 4 || xhr.readyState == 3) && xhr.status == 200) {
        var result = JSON.parse(xhr.responseText);
        rs.id = myid;
        rs.starttime = mystarttime;
        rs.data = result.content;
        rs.endtime = new Date();
    }
    else {
        rs.err = 'Error.   ReadyState: ' + xhr.readyState + ' Status:' + xhr.status;
    }
    self.postMessage(rs);
    self.close();
    },500);
};

试试吧