2012-06-21 60 views
1

我有一个网站和一个for循环使用变量(i)的脚本;JavaScript/jQuery - 拦截循环

因此,循环如下所示:

var i; 
for(i=start_n;i<=end_n;i++){ 
//function to execute 
} 

所以,我需要它可以拦截for循环,并立即停止在单击“停止”按钮时的功能。

我尝试了以下功能:

1:

$('#btnStop').click(function(){ 
i=end_n; 
}); 

第二:

$('#btnStop').click(function(){ 
stopLoading = true; 
}); 

for(i=start_n;i<=end_n;i++){ 
if(stopLoading==true){break;} 
//function to execute 
} 

两个人都没有工作。那么,有什么方法可以拦截循环并阻止它吗?

+6

JavaScript是单线程...如果环路运行时,它运行时,你不能阻止它。尽管你可以创建一个任务队列,并用'setTimeout'异步处理它。 –

+0

我会试试看,谢谢。 –

+1

您可能会阻止它的唯一方法是如果您将循环体放入'setTimeout'回调中,这可能需要大量的重构。 (编辑:费利克斯打他编辑!) – apsillers

回答

1

你有没有尝试过的setInterval,而不是为循环?

例:

var interval = setInterval(function(){ /*do something many times*/}, 99); 
$('#stop').click(function(){ clearInterval(interval); }); 
1

你不能中断JS执行。你可以做的最好的方法是在setInterval内部运行循环,并让按钮清除间隔,但缺点是页面必须在每次迭代之间重新绘制,所以最多每秒钟可以获得60次迭代,而不是数百万人可以正常逃脱。

1

For循环是阻塞的并发的,你可以通过使用某种超时运行而不是使用for循环来“模拟”这个循环,比如说每10毫秒。但是,这不会完成同样的事情。

就像评论说的那样,javascript(在浏览器上)是单线程的,所以一旦你在for循环中,没有其他的事情会发生,直到循环结束。

0

你不能真正做到你想要的,但是你可以用一些开销来打断循环。例如,每次循环时都可以执行数据库请求(ajax)来检查循环是否应该被中断。 然后你可以有一个按钮来设置循环检查的“应该中断”值。

不过,我不知道按预期这将工作...