setTimeoutとsetIntervalの違い
JavaScriptにおけるsetTimeoutとsetIntervalの違い
setTimeoutとsetIntervalは、JavaScriptで非同期処理を実現するための関数です。どちらも指定したコードを一定時間後に実行しますが、その挙動は異なります。
setTimeout
- 返り値
setTimeoutはタイマーのIDを返します。これをclearTimeout関数でキャンセルできます。 - 遅延時間
遅延時間を指定します。 - 一度だけ実行
setTimeoutは指定したコードを一度だけ実行します。
setTimeout(function() {
console.log("Hello, world!");
}, 2000); // 2秒後にログを出力
setInterval
- 間隔
間隔を指定します。 - 繰り返し実行
setIntervalは指定したコードを繰り返し実行します。
setInterval(function() {
console.log("Tick!");
}, 1000); // 1秒ごとにログを出力
重要な違い
- キャンセル
setTimeoutはclearTimeout関数で一度だけキャンセルできますが、setIntervalはclearInterval関数で繰り返しを中止できます。 - 実行回数
setTimeoutは一度しか実行されないのに対し、setIntervalは指定された間隔で繰り返し実行されます。
- setInterval
繰り返し実行する間隔処理。 - setTimeout
一度だけ実行する遅延処理。
用途
- setInterval
- 定期的なデータ更新
- ゲームループ
- リフレッシュレートの制御
- setTimeout
- タイマーの実現
- 非同期処理の制御
- アニメーションのフレームレートの制御
setTimeoutとsetIntervalの例
function countDown(seconds) {
if (seconds === 0) {
console.log("Time's up!");
return;
}
console.log(seconds);
setTimeout(function() {
countDown(seconds - 1);
}, 1000); // 1秒後に再帰呼び出し
}
countDown(5); // 5秒のカウントダウン
このコードでは、再帰的なsetTimeoutを使用してカウントダウンを実装しています。
- この再帰呼び出しにより、1秒ごとにカウントダウンが続きます。
seconds
が0でない場合、現在の秒数をログに出力し、1秒後に再帰的にcountDown
関数を呼び出します。seconds
が0になったらカウントダウンが終了します。
function blinkText(element) {
setInterval(function() {
element.style.visibility = (element.style.visibility === "visible") ? "hidden" : "visible";
}, 500); // 0.5秒ごとにテキストの表示/非表示を切り替える
}
const textElement = document.getElementById("text");
blinkText(textElement);
このコードでは、setIntervalを使用してテキストの点滅を実装しています。
- 関数内でテキスト要素の
visibility
プロパティをvisible
とhidden
の間で切り替えることで、テキストが点滅します。 setInterval
で0.5秒ごとに指定された関数を呼び出します。
async/await
- 読みやすさ
複雑な非同期処理をより直感的に理解できます。 - 非同期処理の簡潔な表現
async/awaitを使用することで、非同期処理を同期的なコードのように記述できます。
async function countDownAsync(seconds) {
for (let i = seconds; i > 0; i--) {
console.log(i);
await new Promise(resolve => setTimeout(resolve, 1000));
}
console.log("Time's up!");
}
Promise
- チェーン化
Promiseをチェーン化することで、複数の非同期処理を順次実行できます。 - 非同期処理の管理
Promiseを使用することで、非同期処理の状態を管理できます。
function countDownPromise(seconds) {
return new Promise(resolve => {
if (seconds === 0) {
resolve("Time's up!");
} else {
console.log(seconds);
setTimeout(() => {
countDownPromise(seconds - 1).then(resolve);
}, 1000);
}
});
}
Web Workers
- パフォーマンス
UIのレスポンス性を向上させます。 - 重い処理のオフロード
Web Workersを使用することで、重い処理をメインスレッドから分離できます。
const worker = new Worker('worker.js');
worker.onmessage = (event) => {
console.log(event.data);
};
worker.postMessage(5);
worker.js
self.onmessage = (event) => {
let count = event.data;
for (let i = count; i > 0; i--) {
self.postMessage(i);
setTimeout(() => {
if (i > 1) {
self.postMessage(i - 1);
} else {
self.postMessage("Time's up!");
}
}, 1000);
}
};
javascript setinterval