2012-06-21 100 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)來檢查循環是否應該被中斷。 然後你可以有一個按鈕來設置循環檢查的「應該中斷」值。

不過,我不知道按預期這將工作...