[英]IE7 hangs when using (to much) ajax calls with async: false
我在更大的脚本中具有以下功能,该脚本从php文件加载翻译:
function loadLanguages(language){
var data = new Object();
data.language = language;
var dataString = $.toJSON(data);
var langSt = $.ajax({
url: "/VID/ajax/loadtranslations.php",
data: ({data: dataString}),
async: false
}).responseText;
var languageArr = $.evalJSON(langSt);
return languageArr;
}
在FF中工作,但在IE7和IE8中浏览器将挂起。当我注释掉IE函数中的ajax调用时,它不会挂起。 如果我将其设置为async:true,该功能将无法再使用,但浏览器将不会挂起。 仅当我将async设置为false时,IE才会挂起。 我有点不解为什么!
您永远不要使用async: false
; 它将始终挂起浏览器,直到请求完成。
这是Java脚本是单线程并且永远不会更改的事实的必要结果。
编辑对不起,您的意思是挂 (您所说的); 我和其他人只是高兴地阅读block 。
我注意到您正在使用$.ajax
直接返回的XMLHttpRequest
对象的responseText
。 我认为即使有同步请求,我仍然会使用回调:
function loadLanguages(language){
var data = new Object();
data.language = language;
var dataString = $.toJSON(data);
var languageArr = /* ...some appropriate default value if the request fails... */;
$.ajax({
url: "/VID/ajax/loadtranslations.php",
data: ({data: dataString}),
async: false,
success: function(langSt) {
languageArr = $.evalJSON(langSt);
}
});
return languageArr;
}
当您在许多浏览器(不仅仅是IE)上使用同步 Ajax请求时,用户界面在请求期间将变得完全无响应。 在IE上,它特别糟糕,因为它不仅是您的页面,而且整个浏览器过程最终都处于等待状态-用户甚至无法退出并在另一个选项卡中执行其他操作。
坦率地说,这会导致不良的用户体验。
发生这种情况的原因是,目前,Web浏览器上的JavaScript是单线程的,并且在许多浏览器中,该线程是UI线程。 即使在非基于浏览器的应用程序中,为非UI处理占用UI线程也是不理想的。
因此,您希望避免在任何可能的情况下都使用同步ajax请求,并且几乎总是可能的(甚至可能总是可能的)。 它涉及到您的方法中的一些重构,使函数“ A”启动某些事情,然后再由函数“ B”完成(ajax调用中的“成功” callack),但是要进行重构(然后在设计中使用这种思维方式)。未来)为整体带来更好的用户体验。
在广泛实施Web Worker之前,您需要谨慎使用单个JavaScript线程,并根据事件和回调进行思考。 我发现,被迫这样做实际上可以最终改善我的代码,并且可以将我的方法更好地改变为其他环境。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.