JavaScriptのsetInterval()とsetTimeout()を使い方
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については、次の記事を参考にしてみてください。