2015-05-01 63 views
1

我想運行x函數爲n秒。我的嘗試:重複函數執行n秒

var stop = false; 

setTimeout(function(){stop = true}, n); 

while(!stop) x(); 

但這並沒有工作...我的理解的原因是,setTimeout的等待,直到沒有任務正在運行,然後執行相應的功能。是對的嗎?

另一種方式來做到這一點是這樣的:

var stop = false, started = Date.now(); 

while(!stop) { 
    if((Date.now() - started) > n) stop = true; 
    else x(); 
} 

有沒有其他更好的辦法?

+0

秒或毫秒? –

+0

問題是,如果要完成多少次,按秒計算?因爲while循環實際上會凍結其他所有內容。這也意味着你的函數將被運行一個不可預知的次數 – axelduch

+0

無論多少次都沒關係,直到x秒或毫秒通過,然後停止重複執行 – Almis

回答

2
var stop = false; 

setTimeout(function(){stop = true}, n); 

var interval = setInterval(function(){ 
    if(!stop){x();}else{clearInterval(interval);} 
}, 0); 

while語句將阻塞超時功能,如果你不介意使用setInterval的,你能做到這樣。

1

我會做這樣的

var t = new Date().getSeconds() + 10; // 10 seconds 

while(new Date().getSeconds() <= t) 
{ 
    //loop 
} 
1

雖然時間不起來,您可以反覆安排它:

var runRepeatedly = function(f, secs) { 
    var start = Date.now(); 
    var reschedule = function() { 
    var now = Date.now(); 
    if (now - start < secs * 1000) { 
     setTimeout(repeat, 0) 
    } 
    } 
    var repeat = function() { 
    f(); 
    reschedule(); 
    }; 
    repeat(); 
} 

... 

runRepeatedly(x, n); 

注意x不應太長,返回。

0

這裏我的解決辦法:

<html> 
<body> 
<p id="demo"></p> 

<button onclick="clearInterval(myVar)">Stop time</button> 

<script> 
var myVar = setInterval(function(){myTimer()},1000); 
function myTimer() { 
    var d = new Date(); 
    document.getElementById("demo").innerHTML = d.toLocaleTimeString(); 
} 
</script> 
</body> 
</html>