2013-03-30 38 views
1

這個循環不是一種常見的疾病,但什麼是它的濫用?如何打破,而外面

var t = true; 

setTimeout(function(){ 
    t=false; 
},1000); 

while(t){ 
    //loop... 
    //if t==false, break loop. 
} 

另一個條件,它會導致無限循環太:

button.onlcick = function(){ 
    t = false; 
} 
+0

第一vertion並不保證下,工作。由於JavaScript定時器不保證。但第二個應該工作。在糾正您的拼寫錯誤後,您遇到的問題與我之前提到的同行相似 – 2013-03-30 07:22:52

+0

這不常見,因爲它會凍結瀏覽器。 – RobG

+0

@silentboy 他們不工作,都凍結瀏覽器。 我想知道爲什麼'while'不會中斷window.t = false? – Sho

回答

3

JavaScript是單線程; setTimeout當您阻止主事件循環時,將不會調用回調(while (t) { ... })。

如果你正在運行在瀏覽器的代碼,你不能真正做到這件事,但是寫在其他的方式你的代碼什麼;

而是阻塞主事件循環,可以使用Promises Pattern

如果你正在運行在類似node您可以使用本機模塊的代碼,使您能夠創建線程(如threads_a_gogo

+0

明白了,謝謝〜 – Sho

0

可以使用與休息狀態的標籤就像 外:而(){ // 代碼 如果() 休息外; }

2

由於while循環不退出,當事情是同步完成的其它代碼永遠不會運行。我最好的提議是不使用while循環,而是使用setTimeout等週期性事件,並在完成時使超時運行。 這樣你就不會創建一個封閉的環境。

1

它不會起作用,因爲JavaScript是不是多線程 - 直至目前的執行結束的線程(它不會,只要你運行你的while循環),不執行其他代碼(無超時調用)並且UI被凍結(按鈕點擊不會響應)。

There 可能是一種在html5中使用新的Web Workers功能執行此類操作的方法,但截至目前,我無法確定。