当使用async:false进行ajax调用时,IE7会挂起

我在一个更大的脚本中有以下函数来加载来自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浏览器将挂起..当我在functionIE中注释掉ajax调用时不会挂起。 如果我将其设置为async:true该函数不再起作用,但浏览器不会挂起。 只有当我将async设置为false时,IE才会挂起。 我有点不解为什么!

你永远不应该使用async: false ; 它将始终挂起浏览器,直到请求完成。

这是Javascript是单线程的,而且永远不会改变的必然结果。

编辑抱歉,你的意思是 (你说的话); 我和其他人只是高兴地读了

我注意到你正在使用$.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工作者被广泛实现之前,您需要谨慎使用该单个JavaScript线程并根据事件和回调进行思考。 我发现被迫这样做实际上最终改进了我的代码,并且正在改变我对其他环境的方法。