56

私はsetTimeout10秒ごとに繰り返そうとしています。setTimeoutデフォルトでは、待機してからアクションを1回だけ実行することを知っています。どうすればプロセスを繰り返すことができますか?

setTimeout(function() {
  setTimeout(function() {
    console.log("10 seconds");
  }, 10000);
}, 10000);
4

7 に答える 7

90

多分あなたは使うべきですsetInterval()

于 2012-07-24T04:16:57.770 に答える
48

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を使用してください。)

于 2012-07-24T04:21:43.520 に答える
20

私によると、setInterval()はあなたの場合の最良の方法です。
ここにいくつかのコードがあります:

 setInterval(function() {

//your code

}, 10000); 
// you can change your delay by changing this value "10000".
于 2012-07-24T05:36:46.533 に答える
18

@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();
于 2012-07-24T04:35:57.217 に答える
0

これは、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>
于 2012-07-24T06:45:58.860 に答える