2010-09-03 91 views
0

我正在制作一个邮件列表脚本,它利用ajax(async = false)以块的形式发送电子邮件。JavaScript循环使UI无响应

基本上周期是这样的:

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 
}); 
} 
+1

听起来很正常。你以这种方式处理了多少行? – 2010-09-03 08:53:11

+0

总计超过30k,每个线程100行。这件事就像一个魅力,唯一的问题是,我想要一种方式来阻止它完成。 – 0plus1 2010-09-03 08:56:38

+0

你能提供'startThread'的代码吗? – GenericTypeTea 2010-09-03 09:00:58

回答

4

startThread()函数名称是一种误导,在,因为JavaScript不仅单线程的网页浏览器,但这股与页面呈现在同一个线程。

由于您使用的是async=false$.ajax调用成为阻塞函数,并且这会阻止页面呈现线程,从而导致UI无响应。

引述jQuery documentation(强调):

异步

默认:true

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

可能的解决方案:

  • 背驮式在一个JSON对象的数据,并发送只有一个$.ajax请求。如果可能的话使用async=true
+0

不,你错了,尝试从for循环中注释startThread,你会发现它是for循环而不是用来阻塞UI的ajax调用! – 0plus1 2010-09-03 09:18:47

+0

我想添加别的东西。如果你用ajax调用(async)启动一个for循环,你基本上就会破坏这个目的。每个线程发送大量的电子邮件然后暂停,如果我启动了100多个并发Ajax调用将发送全部到SMTP服务器相同。 – 0plus1 2010-09-03 09:21:53

+0

@ 0plus1:感谢downvote :) ...但是,两者都阻止。具有'async = false'的'$ .ajax()'会阻塞,直到服务器返回一个响应。这通常是几十/几百毫秒......取决于迭代次数,for循环块。做一个'while(true){}'阻止UI ...我不知道你的应用程序的逻辑。我只是试图告诉你为什么你有问题。 – 2010-09-03 09:22:31