我在一个更大的脚本中有以下函数来加载来自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才会挂起。我有点不解为什么!
答案 0 :(得分:4)
你永远不应该使用async: false
;它会一直挂起浏览器,直到请求完成。
这是Javascript是单线程的,而且永远不会改变的必然结果。
答案 1 :(得分:1)
编辑抱歉,您的意思是挂起(您所说的);我和其他人只是高兴地读了阻止。
我注意到您正在使用responseText
直接返回的XMLHttpRequest
对象的$.ajax
。我想即使有同步请求,我仍然会使用回调:
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 workers之前,您需要谨慎使用该单个JavaScript线程,并根据事件和回调进行思考。我发现被迫这样做实际上最终改进了我的代码,并且正在改变我对其他环境的方法。