8 javascript ajax internet-explorer
我有一个Web应用程序并使用ajax回调我的网络服务器来获取数据.
有时(在相当不可预测的时刻,但它可以被复制)IE完全挂起5分钟(窗口显示Not Responding)然后返回并且xmlhttprequest对象响应错误12002.
我可以重现它的方式如下.
请帮忙.我一直在寻找3天.
请注意:*我无法在firefox中测试它(该应用程序不兼容Firefox)*我必须使用同步调用(这就是构建应用程序的方式,并且需要花费太多的开发人员来重写它)
为什么会发生这种情况以及如何解决这个问题?
你是对的Jaap,这与Internet Explorer的连接限制为2有关.出于某种原因,IE不会释放与关闭窗口中执行的AJAX请求的连接.
我的情况非常相似,只是稍微简单一些:
您可以尝试的一种技术(在您找到的文章中提到)似乎有效,是在页面的卸载事件中中止XmlHttp请求.
所以类似于:
var xhr = null;
function unloadPage() {
if( xhr !== null ) {
xhr.abort();
}
}
Run Code Online (Sandbox Code Playgroud)
另一个选择是使用同步AJAX调用,它将阻塞直到调用返回,基本上锁定浏览器.鉴于您的具体情况,这可能是也可能是不可接受的.
// the 3rd param is whether the call is asynchronous
xhr.open( 'get', 'url', false );
Run Code Online (Sandbox Code Playgroud)
最后,如其他地方所述,您可以调整IE在注册表中使用的最大连接数.期待访问您网站的访问者然而这样做是不现实的,并且它实际上不会解决问题 - 只是推迟它发生.作为旁注,IE8将允许6个并发连接.
ERROR_INTERNET_TIMEOUT
12002
The request has timed out.
Run Code Online (Sandbox Code Playgroud)
Winsock 是 IE 中 XMLHTTP 的底层套接字传输对象,因此任何不在 HTTP 错误范围(300,400,500 等)内的错误几乎总是 winsock 错误。
您的问题不清楚的是第二次是否查询相同的资源。您可以通过附加以下内容来强制使用新的未缓存资源:
'?uid=+'Math.random()
Run Code Online (Sandbox Code Playgroud)
到可能解决问题的 URL。
另一种解决方案可能是将一个函数附加到窗口对象上的“onbeforeunload”事件,以便在窗口 B 关闭之前调用 abort() 任何活动的 XMLHTTP 请求。
希望这两个指针可以解决您的错误。