2015-06-29 31 views
2

我試圖在無限循環的情況下超時一個函數。但下面的行不通。任何想法爲什麼以及如何解決它?在JavaScript中取消無限循環

setTimeout(clearValues,1000); 

function clearValues(){ 
    i=0; 
    alert("hi "+i); 
} 

i=19 
function infin(){ 
    while(i>0){ 
     console.log(i); 
     i++; 
    } 
    alert("Done"); 
} 

infin(); 

在下面的情況下,我得到的警告顯示(有點晚於預期),在控制檯聲明甚至警告後繼續打印。這意味着setTimeout不會在這種情況下等待循環結束。對此有何解釋?

setTimeout(clearValues,500); 

function clearValues(){ 
    alert("clear"); 
} 


function infin(){ 
for(i=0;i<10000;){ 
    i=i+0.3; 
    console.log(i); 
} 
} 

infin(); 
+0

在哪個動作是U調用這些函數? – AkshayJ

+0

沒有具體操作。這只是作爲腳本運行。 – codingsplash

+0

第二個示例只有在循環結束後才起作用。 –

回答

3

setTimeout以異步方式工作,意味着它會之後1000ms的以前的事件循環運行完畢。由於while循環永遠不會完成,所以回調將永遠不會被調用。

如果要退出,請向循環添加條件。

+0

它可能與console.log的實現有關。如果你用不同的瀏覽器測試它,你可能會得到不同的結果。 –

1

另一種解決辦法可能是使用間隔:

var code = function(){ 
       console.log('tick'); 
      }; 
var clock = setInterval(code, 200); 

當你不需要它了:

clearInterval(clock); 
+0

OP正在使用'setTimeout'而不是'setInterval' – Tushar

+0

對不起,但OP代表什麼? –

+0

問問題的人 – Tushar

0

它的工作原理,當你有一個稍微不同的情況變了,infin電話。

var i = 0; 
 
setTimeout(clearValues, 1000); 
 
var interval = setInterval(infin, 0); 
 

 
function clearValues() { 
 
    out("clear"); 
 
    clearInterval(interval); 
 
} 
 

 
function infin() { 
 
    if (i < 10000) {     // if you be shure that you 
 
     i++; 
 
     out(i); 
 
    } else {       // never reach the limit, 
 
     clearInterval(interval);  // you can remove the four 
 
    }         // commented lines 
 
} 
 

 
function out(s, pre) { 
 
    var descriptionNode = document.createElement('div'); 
 
    if (pre) { 
 
     var preNode = document.createElement('pre'); 
 
     preNode.innerHTML = s + '<br>'; 
 
     descriptionNode.appendChild(preNode); 
 
    } else { 
 
     descriptionNode.innerHTML = s + '<br>'; 
 
    } 
 
    document.getElementById('out').appendChild(descriptionNode); 
 
}
<div id="out"></div>