JavaScript循环使UI无响应
我正在制作一个邮件列表脚本,它利用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
});
}
你startThread()
函数名称是一种误导,在,因为JavaScript不仅单线程的网页浏览器,但这股与页面呈现在同一个线程。
由于您使用的是async=false
,$.ajax
调用成为阻塞函数,并且这会阻止页面呈现线程,从而导致UI无响应。
引述jQuery documentation(强调):
异步
默认:true
默认情况下,所有的请求被发送异步(即这是默认设置为true) 。如果您需要同步请求,请将此选项设置为false。跨域请求和dataType:“jsonp”请求不支持同步操作。 请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作。
可能的解决方案:
- 背驮式在一个JSON对象的数据,并发送只有一个
$.ajax
请求。如果可能的话使用async=true
。
不,你错了,尝试从for循环中注释startThread,你会发现它是for循环而不是用来阻塞UI的ajax调用! – 0plus1 2010-09-03 09:18:47
我想添加别的东西。如果你用ajax调用(async)启动一个for循环,你基本上就会破坏这个目的。每个线程发送大量的电子邮件然后暂停,如果我启动了100多个并发Ajax调用将发送全部到SMTP服务器相同。 – 0plus1 2010-09-03 09:21:53
@ 0plus1:感谢downvote :) ...但是,两者都阻止。具有'async = false'的'$ .ajax()'会阻塞,直到服务器返回一个响应。这通常是几十/几百毫秒......取决于迭代次数,for循环块。做一个'while(true){}'阻止UI ...我不知道你的应用程序的逻辑。我只是试图告诉你为什么你有问题。 – 2010-09-03 09:22:31
听起来很正常。你以这种方式处理了多少行? – 2010-09-03 08:53:11
总计超过30k,每个线程100行。这件事就像一个魅力,唯一的问题是,我想要一种方式来阻止它完成。 – 0plus1 2010-09-03 08:56:38
你能提供'startThread'的代码吗? – GenericTypeTea 2010-09-03 09:00:58