繁体   English   中英

IE7在与异步使用(大量)ajax调用时挂起:false

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM