0Pricing
JavaScript Academy · レッスン

setTimeout、setInterval、タイマーのずれ

setTimeoutとsetIntervalで単発・反復タスクをスケジュールし、タイマーのずれを減らす簡単な方法を学びます。

「setTimeout、setInterval、タイマーのずれ」はCoddyKit上の無料JavaScript Academyレッスンです。 これはレッスン1/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJavaScript Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 JavaScript Academyコースには全3レッスンが含まれています。

タイマー入門

目標:処理を適切にスケジュールします。

  • setTimeout:後で1回実行します
  • setInterval:繰り返し実行します
  • ドリフト:タイマーがずれる理由を学びます
  • シンプルなドリフト対策
setTimeout、setInterval、タイマーのずれ — イラスト1

setTimeout — 1回だけ実行

setTimeout(fn, ms)は、遅延時間の後に1回だけ実行されます(正確な時刻ではなく、最小の待ち時間です)。

// setTimeout schedules a one-off callback
console.log("A: start");

setTimeout(function () {
  console.log("B: after ~5ms");
}, 5);

console.log("C: scheduled");
setTimeout、setInterval、タイマーのずれ — イラスト2

setInterval — 繰り返し実行

setIntervalは自動的に繰り返し実行されます。停止するにはclearInterval(id)を使います。

// setInterval repeats; always clear it
let count = 0;

const id = setInterval(function () {
  count = count + 1;
  console.log("tick", count);

  // Stop after 3 ticks to avoid endless logs
  if (count >= 3) {
    clearInterval(id);
    console.log("stopped");
  }
}, 5);
setTimeout、setInterval、タイマーのずれ — イラスト3

ドリフトを確認する

実際の間隔は一定ではありません。処理やデバイスの負荷、イベントループによってドリフトが発生します。

// Drift demo: expected vs actual timing
const targetMs = 5;
let last = Date.now();
let times = 0;

const driftId = setInterval(function () {
  const now = Date.now();
  const gap = now - last; // actual gap
  last = now;
  times = times + 1;
  console.log("gap~", gap, "ms");

  if (times >= 3) {
    clearInterval(driftId);
    console.log("done");
  }
}, targetMs);
setTimeout、setInterval、タイマーのずれ — イラスト4

基準時刻に合わせたスケジュール

変化する予定時刻に合わせます。次の遅延時間を予定時刻から計算することで、誤差の蓄積を防ぎます。

// Simple drift fix: schedule from the expected time
const step = 5;
let expected = Date.now() + step;
let ticks = 0;

function tick() {
  ticks = ticks + 1;
  const now = Date.now();
  const drift = now - expected; // positive if we are late
  console.log("drift:", drift, "ms");

  // Compute next expected time first
  expected = expected + step;

  // Next delay = time until the next expected timestamp
  const nextDelay = Math.max(0, expected - Date.now());

  if (ticks < 3) {
    setTimeout(tick, nextDelay);
  } else {
    console.log("aligned stop");
  }
}

setTimeout(tick, step);
setTimeout、setInterval、タイマーのずれ — イラスト5

ヒントとチェックリスト

ヒント:

  • 処理が終わったら必ずclearIntervalします。
  • 一定の間隔を保つには、基準時刻に合わせたsetTimeoutループを優先します。
  • ドリフトを減らすため、タイマーのコールバックは短く保ちます。
setTimeout、setInterval、タイマーのずれ — イラスト6

ドリフト対策クイズ

簡単な確認:ドリフトの削減です。

setTimeout、setInterval、タイマーのずれ — イラスト7

まとめ

まとめ:1回だけ実行する処理にはsetTimeout、繰り返しにはsetIntervalを使い、必ず停止処理も行います。また、次の実行を予定時刻に合わせることでドリフトを減らしました。

setTimeout、setInterval、タイマーのずれ — イラスト8

よくある質問

「setTimeout、setInterval、タイマーのずれ」レッスンは無料ですか?

はい。「setTimeout、setInterval、タイマーのずれ」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、JavaScript Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 JavaScript Academyコースには全3レッスンが含まれています。

「setTimeout、setInterval、タイマーのずれ」で何を学びますか?

setTimeoutとsetIntervalで単発・反復タスクをスケジュールし、タイマーのずれを減らす簡単な方法を学びます。 ブラウザで直接実行するハンズオンコードでJavaScript Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

JavaScript Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJavaScript Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/3です。

「setTimeout、setInterval、タイマーのずれ」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJavaScript Academyレッスンでコードを書いて実行できますか?

はい。すべてのJavaScript Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. setTimeout、setInterval、タイマーのずれ
  2. デバウンスとスロットル — 自作する
  3. アニメーションのタイミング — 時間ベースのループ入門
← JavaScript Academyに戻る