2008-05-29

[備忘] setIntervalとsetTimeoutの使い分けがわからない

わかっていないことの備忘録。 JavaScriptでタイマーを使ったコード(アニメーションとか)を書く時のはなし。

setIntervalを終了条件つきで書くか、

var tid = setInterval(function() {
  // 処理
  if (is_end) clearInterval(tid); /* 終了条件 */
}, milliseconds);

必要な回数だけsetTimeoutを呼ぶか。

for (var i=1; i<=times; i++) {
  setTimeout(function() {
    // 処理
  }, milliseconds * i);
}

「// 処理」に当たる部分を1回しか実行しないなら、タイマーの破棄が必要ない分だけsetTimeoutの方がいい気がする。でも、「// 処理」を複数回実行するとなると、どういう基準で使い分けるのがいいんやろか?

今のところ、事前に「// 処理」の回数がわかっている場合にsetTimeout、それ以外の場合はsetIntervalという風に使い分けているけど、setTimeoutのforループが千回とか超えるとちょっと不安になる。

setTimeoutとsetIntervalの違いがよくわかってない。→調べて追記しよう。

追記

お、ココにsetTimeout/setIntervalの違いが。

JavaScriptはシングルスレッドなので、非同期処理(イベントハンドラとか、タイマーによる遅延処理)はキューを使って処理しているから、setTimeout/setIntervalのコールバックが遅れることもあるよ。的なことが書いてあって、

  • setTimeoutは、指定したミリ秒後にコールバックを実行。
  • setIntervalは、指定したミリ秒間隔でコールバックを実行。

とある。

うーん、おもしろいけど、何か違う。setTimeoutで指定したコールバックが実行キューに入るのはわかるけど、キューに入れるタイミングをどうやって管理されているのかが知りたい。それがわかれば、「forループ + setTimeout」と「setInterval + 終了条件」の違いがわかるよなあ。

Posted at 00:24 in | WriteBacks (0) | Edit