JavaScript

JavaScriptのsetInterval()とsetTimeout()を使い方

この記事の目次
  1. setInterval()の使い方
  2. setInterval()の止め方
  3. タイマーの作り方
  4. setTimeout()の使い方
  5. setTimeout()の止め方
  6. setTimeout()の内部関数に引数を設定する
  7. タイマー処理の違いを理解する
  8. setIntervalの仕組み
  9. setTimeoutの仕組み
  10. 例外処理を使う

JavaScriptのsetInterval()とsetTimeout()を使い方をまとめました。

setInterval()の使い方

時刻を指定した時間ごとに返したい場合に、使えるのがsetInterval()命令です。
第一引数に関数、第二引数にミリ秒を渡すと、関数を指定したミリ秒間隔で実行してくれるという命令です。
タイマー機能に必須なので、具体的なserInterval()の使い方は次の通りです。

setInterval()はミリ秒なので、1秒なら1000を指定してあげる。
また関数を引数として渡すときは、()をつけてはいけない。
setInterval(showTime, 2000)だと2秒後にshowTime関数を実行するという意味になります。

注意点としては、showTIme()とshowTimeでは意味が違います。
()をつけると、この関数を実行することで得られる値をsetInterval()に渡すことになり、やりたいことと異なってしまいます。返り値の設定がないので、undefinedとなってしまいます。

'use strict';

  {
    function showTime() {
      console.log(new Date());
    }
    
    setInterval(showTime, 2000);

  }

setInterval()の止め方

上の状態だけでは、ずっと処理が繰り返されます。
setInterval()を止める手順は次の通りです。

  • setInterval()を定数に格納する
  • カウンター用の変数iをグローバルスコープで設定する
  • 関数内に繰り返し処理をかく
  • 条件文を書く(指定した回数になったらclearInterval()を処理)

setInterval()を止めるためには、clearInterval()という命令を使います。
そのためにはclearInterval()に渡すために、setInterval()を実行したときの値を定数に格納します。
今回は定数をinterval4timesとして、setInterval()が4回実行されたときに止めるとします。
繰り返し処理を書き、条件がきたら、clearInterval()命令に渡せば処理がとまります。

'use strict';

{
  let i = 0;

  function showTime() {
    console.log(new Date());
    i++;
    if (i > 3) {
      clearInterval(interval4times);
    }
  }
  
    const interval4times = setInterval(showTime, 1000);
}

タイマーの作り方


{

//timerの関数
  const startTimer = function () {

//タイマーを止めるためには名前をつけておく必要がある
    const tick = function () {
      const min = String(Math.trunc(time / 60)).padStart(2, 0);
      const sec = String(time % 60).padStart(2, 0);

// 呼び出されるたびに時間を表示
      console.log(`${min}: ${sec}`);

// 0秒になったらtimerをとめて、メッセージを出す
      if (time === 0) {
        clearInterval(timer);
        console.log(`タイムアップです`);
      }

// 1sごとにtimeを減らす
      time--;
      //これを上にかくと残り1秒に達した時点でtime === 0となりメッセージが表示されてしまう。
    };

// タイマー時間を設定
    let time = 100;

// 1秒ごとに呼び出す
    tick(); //最初に一回呼び出すこと。これがないと始まる前にも1秒待たないといけなくなります。
    const timer = setInterval(tick, 1000);

  };

//timerを呼び出す
  timer = startTimer();
}

 

  • タイマーを止めるためには名前をつけておく必要があります。
  • 呼び出されるたびに時間を表示します。
  • 0秒になったらtimerをとめて、したい処理をしましょう。今回の場合はメッセージを出しています。
  • 1sごとにtimeを減らしましょう。
  • タイマーの時間を設定します。
  • timerを呼び出します。

注意点としては、最初に一回呼び出すことです。そうしないと始まる前にも1秒待たないといけなくなります。
また、「1sごとにtimeを減らす」処理について、「0秒になったらtimerをとめて、したい処理をする」前に記述しておく必要があります。
なぜなら、「1sごとにtimeを減らす」処理を先に書いてしまうと、残り1秒になったときにすでに0秒になったときの処理をしてしまうからです。

timerを呼び出しについて

 

  • timerを呼び出すには、timer = startTimer()関数とします。
  • その中に、const timer = setInterval(tick, 1000)と設定します。
  • そのためtickが呼ばれて、またtimer = setInterval(tick, 1000)でtickが呼ばれます。
  • そして、 (time === 0) になったら、clearInterval(timer)で止まります。
スポンサーリンク

setTimeout()の使い方

指定した時間に一回だけ実行するときに使う命令が、setTimeout()です。
setInterval()と要領は同じで、第一引数に関数、第二引数にミリ秒を渡します。
setTimeout()はミリ秒なので、1秒なら1000を指定します。
また関数を引数として渡すときは、()はつけません。

1回だけ実行されるのですが、関数の中に入れることで、繰り返し実行させることもできます。

'use strict';
{
  function showTime() {
    console.log(new Date);
    setTimeout(showTime, 1000);
  }

  showTime();

}
  }

一番したのshowTime();が実行されると、
showTime()が実行されます。
showTime()の中のsetTimeout()でshowTimeが呼び出されます。
そしてshowTime()が実行されて、を1000ミリ秒ごとに繰り返すことになります。

結果的にsetInterval()と似たこともできます。

setTimeout()の止め方

このように関数の中に入れて繰り返し処理しているsetTimeout()を止めるには、setInterval()とほぼ同じようなことを行います。

変数iでカウンター用の数値をつくります。
変数iが条件を満たしたとき、clearTimeout()で止めることができます。

clearTimeout()に引数を渡す必要があるので、timeout6timesなどとして、
setTimeout(showTime, 1000)を定数timeout6timesに格納します。

'use strict';
{
  let i = 0;

  function showTime() {
    console.log(new Date);
    const timeout6times = setTimeout(showTime, 1000);
    i++;
    if (i > 5) {
      clearTimeout(timeout6times);
    }
  }

  showTime();
}

setTimeout()の内部関数に引数を設定する

setTimeout()は、コールバック関数を取ります。



setTimeout((ing1, ing2) => 
 console.log(`${ing1}と${ing2}を入れたカレーです。`),
 3000,
 'トマト',
 'なす'
);
//トマトとなすを入れたカレーです。


setTimeoutのコールバック関数に引数を設定することで、setTimeout()の第2引数の時間を設定した後の引数に渡すことができます。

また、次のように条件を組み合わせてタイマーを動かさないこともできます。




const ingredients = ['にんじん','たまねぎ', 'じゃがいも'];

const curry = setTimeout(
  (ing1, ing2, ing3) => 
console.log(`${ing1},${ing2},${ing3}の入ったカレーです。`),
  2000,
  ...ingredients //スプレッド構文でいれれる
);

if(ingredients.includes('たまねぎ')) clearTimeout(curry);
//これは動作しない


タイマー処理の違いを理解する

setIntervalとsetTimeoutは同じように使えても、挙動が異なります。

setIntervalの仕組み

setIntervalは、指定した時間で繰り返し処理をするための命令です。

1000msごとに指定して、処理に200msかかる場合、きっかり1000msごとに処理が実行されます。
同様に、指定した時間より多い、たとえば1500msかかる処理を1000msごとに実行するとした場合も、
きっかり1000msごとに処理が実行されます。
そのため、処理が被る時間が発生し、システムに負荷がかかる場合があります。

setTimeoutの仕組み

setTimeoutの場合、200msの処理が終わった後すぐに、そこから1000ms後に処理が実行されます。
そのため、1500msかかる処理でも、それが終わった後1000ms後に処理が実行されるため、被ることがありません。

そのため、システムに負荷をかけたくない場合はsetTimeoutもよく使われるので覚えておきましょう。

例外処理を使う

数字を入れることを想定しているけれども、文字列が入力された場合、エラーとなります。

開発者が意図していないことが起きることを例外といいます。

例外の処理には、try{}catchを使います。
tryには例外が起きそうな部分を書き、
catchには例外が起きたときの処理をかきます。

errorのeがcatchの引数としてよく使われます。
具体的な例をみてみましょう。

'use strict';
  {
    const number = ’こんにちは'; //本来は数字がほしかった

    try {
      console.log(number * number * 2);
    } catch (e) {
      console.log(e);
    }

  }

setTimeout()とthisについては、次の記事を参考にしてみてください。
JavaScriptのthisキーワードについて

スポンサーリンク