私はsetTimeout
10秒ごとに繰り返そうとしています。setTimeout
デフォルトでは、待機してからアクションを1回だけ実行することを知っています。どうすればプロセスを繰り返すことができますか?
setTimeout(function() {
setTimeout(function() {
console.log("10 seconds");
}, 10000);
}, 10000);
私はsetTimeout
10秒ごとに繰り返そうとしています。setTimeout
デフォルトでは、待機してからアクションを1回だけ実行することを知っています。どうすればプロセスを繰り返すことができますか?
setTimeout(function() {
setTimeout(function() {
console.log("10 seconds");
}, 10000);
}, 10000);
多分あなたは使うべきですsetInterval()
setInterval()
おそらくあなたが探しているものですが、やりたい場合は次のようにして同じ効果を得ますsetTimeout()
:
function doSomething() {
console.log("10 seconds");
setTimeout(doSomething, 10000);
}
setTimeout(doSomething, 10000);
または、別の関数を宣言せずに関数式に固執したい場合は、名前付き関数式にする必要があります。
setTimeout(function doSomething() {
console.log("10 seconds");
setTimeout(doSomething, 10000);
}, 10000);
(または、非推奨の言語機能を使用してもかまわない場合は、arguments.calleeを使用してください。)
私によると、setInterval()はあなたの場合の最良の方法です。
ここにいくつかのコードがあります:
setInterval(function() {
//your code
}, 10000);
// you can change your delay by changing this value "10000".
@nnnnnn と @uzyn が提供する回答とは異なり、次の回答setInterval
で詳しく説明する理由により、使用しないことをお勧めします。代わりに、次のデルタ タイミング スクリプトを使用します。
function DeltaTimer(render, interval) {
var timeout;
var lastTime;
this.start = start;
this.stop = stop;
function start() {
timeout = setTimeout(loop, 0);
lastTime = + new Date;
return lastTime;
}
function stop() {
clearTimeout(timeout);
return lastTime;
}
function loop() {
var thisTime = + new Date;
var deltaTime = thisTime - lastTime;
var delay = Math.max(interval - deltaTime, 0);
timeout = setTimeout(loop, delay);
lastTime = thisTime + delay;
render(thisTime);
}
}
上記のスクリプトはrender
、指定された にできるだけ近い関数を実行しinterval
、質問に答えるためにsetTimeout
プロセスを繰り返します。あなたの場合、次のようにすることができます:
var timer = new DeltaTimer(function (time) {
console.log("10 seconds");
}, 10000);
var start = timer.start();
これは、setTimeoutを使用して、一定の間隔にできるだけ近づけて自分自身を呼び出そうとした関数です。出力を見ると、時間がドリフトしてリセットされていることがわかります。
<script type="text/javascript">
function Timer(fn, interval) {
this.fn = fn;
this.interval = interval;
}
Timer.prototype.run = function() {
var timer = this;
var timeDiff = this.interval;
var now = new Date(); // Date.now is not supported by IE 8
var newInterval;
// Only run if all is good
if (typeof timer.interval != 'undefined' && timer.fn) {
// Don't do this on the first run
if (timer.lastTime) {
timeDiff = now - timer.lastTime;
}
timer.lastTime = now;
// Adjust the interval
newInterval = 2 * timer.interval - timeDiff;
// Do it
timer.fn();
// Call function again, setting its this correctly
timer.timeout = setTimeout(function(){timer.run()}, newInterval);
}
}
var t = new Timer(function() {
var d = new Date();
document.getElementById('msg').innerHTML = d + ' : ' + d.getMilliseconds();
}, 1000);
window.onload = function() {
t.run();
};
</script>
<span id="msg"></span>