在IE9中中止AJAX请求时出错

时间:2014-06-24 00:07:56

标签: javascript ajax internet-explorer internet-explorer-9

我在项目中使用长轮询。当项目运行时,其中一个长轮询请求正在等待来自服务器的响应。现在,当用户生成新模板时,我必须中止之前的长轮询并运行新的轮询。

在IE中中止会产生错误

couldn't complete the operation due to error c00c023f 

我不想使用Jquery并且中止先前的请求非常重要。我试过Try and Catch以防止显示此错误,但它没有用完。

当正常请求(非轮询请求)请求在几秒钟后没有到达服务器时,我也在使用中止,然后我中止旧请求并发送新请求。

我将xmlHttp对象存储在数组中,用于每个请求。

喜欢:array_XMLHttp.push(request1);

我中止了它:array_XMLHttp[index_of_request].abort();

我找不到IE9的任何解决方案,虽然它在所有其他浏览器上都很完美。

更新:

我总是检查XMLHttp对象的status和readyState,如下所示:

function checkResponse(xmlHttp){
    xmlHttp.onreadystatechange=function(){ 
        if(xmlHttp.readyState==4){
            if(xmlHttp.status==200){   
                // Request received
            } 
        }
    }
}      


以下是我启动请求的方式

// to start new XmlHttp object
var xmlHttp=crXH();         

// add the request to array to be aborted later if required
array_XMLHttp.push(request1);

// initiate the callback
checkResponse(xmlHttp);

//send the request to server
send(xmlHttp);


当我中止时:

// The problem now the callback function will not read (undefined) the new property added to the aborted object.
array_XMLHttp[index_of_request].aborted = true; 
array_XMLHttp[index_of_request].abort();

感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

将我们的长篇讨论编成答案...

Per various articles like this one我在这个主题上找到了(这在IE中不是一个不寻常的问题),IE不希望你在调用{{1}后访问xmlHttp对象上的标准属性但它仍会触发一些.abort()事件,导致您尝试访问这些标准属性,从而导致错误。

解决方法是在调用onreadystatechange时在xmlHttp对象上设置自己的属性,在.abort()处理程序中,首先检查自己的readystatechange属性如果已设置,则您知道呼叫已中止,并且您不检查可能导致问题的其他属性。

因此,如果您的.aborted对象被称为xmlHttp,那么您可以这样做:

x

而且,当你想要中止时:

x.readystatechange = function() {
    if (!x.aborted) {
        if(xmlHttp.readyState==4){
            if(xmlHttp.status==200){   
                // Request received
            } 
        }
    }
}