【问题标题】:JavaScript for loop is making the UI unresponsiveJavaScript for 循环使 UI 无响应
【发布时间】:2010-09-03 08:50:46
【问题描述】:

我正在制作一个邮件列表脚本,它利用 ajax (async=false) 分块发送电子邮件。

基本上循环是这样的:

var i = 0;
for(i;i<num_rows;i=i+mxt){
    if($("#panic").val()=='1'){
        break;
    }
    perc = (i*100)/num_rows;
    startThread(i,perc);
}

恐慌值是由按钮设置的,问题是在循环期间(有效)我​​无法与页面交互。

我做错了什么?

谢谢

编辑:

function startThread(i,perc){
l_a = i;
l_b = mxt;

headers = '&mail_from='+mail_from+'&mail_from_name='+mail_from_name+'&mail_subject='+mail_subject;

$.ajax({  
    type: "POST", url: "ajax/thread.php", data: "l_a="+l_a+"&l_b="+l_b+headers, 
    success: function(html){ $("#progressbar").progressbar({value: perc}); },
    async: false
 });
}

【问题讨论】:

  • 对我来说听起来很正常。您以这种方式处理了多少行?
  • 总共超过 30k,每个线程 100 行。这件事就像一个魅力,唯一的问题是我想在它完成之前阻止它。
  • 你能提供startThread的代码吗?
  • 已编辑以包含 startThread 函数。

标签: javascript jquery for-loop


【解决方案1】:

您的 startThread() 函数名称具有误导性,因为 Web 浏览器中的 JavaScript 不仅是单线程的,而且它与页面渲染共享同一个线程。

由于您使用的是async=false$.ajax 调用成为一个阻塞函数,这会阻塞页面渲染线程,使 UI 无响应。

引用jQuery documentation(强调):

异步

默认:真

默认情况下,所有请求都是异步发送的(即默认设置为 true)。如果您需要同步请求,请将此选项设置为 false。跨域请求和 dataType: "jsonp" 请求不支持同步操作。 请注意,同步请求可能会暂时锁定浏览器,从而在请求处于活动状态时禁用任何操作。

可能的解决方案:

  • 在一个 JSON 对象中搭载您的数据,然后只发送一个 $.ajax 请求。如果可能,请使用async=true

【讨论】:

  • 不,你错了,尝试从for循环中注释掉startThread,你会发现阻塞UI的是for循环而不是ajax调用!
  • 我想补充一点。如果您使用 ajax 调用(异步)启动 for 循环,您基本上是在破坏其目的。每个线程发送电子邮件块然后暂停,如果我启动 100 多个并发 ajax 调用将与将它们全部发送到 smtp 服务器相同。
  • @0plus1:感谢您的反对:) ...但是,两者都在阻止。 $.ajax()async=false 会阻塞,直到服务器返回响应。这通常是几十/几百毫秒...... for 循环块取决于迭代次数。执行while (true) { } 会阻止用户界面...我不知道您的应用程序的逻辑。我只是想向您展示您遇到问题的原因。
  • @0plus1:用 jQuery 文档的引用更新了我的答案。
  • @0plus1:这个解决方案是用于公共网站,还是将部署在内部/本地环境中?因为您可以考虑 Web Workers 在 JavaScript 中有多个线程。 Web Worker 可以执行 Ajax 请求。唯一的问题是一些流行的浏览器(IE)不支持它们。这就是为什么我问这是否是一个公共的事情......如果你可以使用 Web Workers,你可能想查看这篇相关文章:hacks.mozilla.org/2009/07/working-smarter-not-harder
猜你喜欢
  • 1970-01-01
  • 2019-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多