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

时间:2010-06-29 13:59:35

标签: javascript jquery ajax firefox internet-explorer-7

我在一个更大的脚本中有以下函数来加载来自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才会挂起。我有点不解为什么!

2 个答案:

答案 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线程,并根据事件和回调进行思考。我发现被迫这样做实际上最终改进了我的代码,并且正在改变我对其他环境的方法。