我在项目中使用长轮询。当项目运行时,其中一个长轮询请求正在等待来自服务器的响应。现在,当用户生成新模板时,我必须中止之前的长轮询并运行新的轮询。
在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();
感谢您的帮助!
答案 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
}
}
}
}