Node.js API - JavaScript のタイマー機能と非同期呼び出し

今回は Node.js API を使ったタイマー機能とそれに関連する関数の非同期呼び出しについて説明します。
Node.js API にある機能ですが、もともと JavaScript にもある機能なので、ブラウザーが対応していればクライアントサイドでも利用できます。

なお、今回説明している関数群は Node.js ではグローバル関数ですが、 JavaScript では window オブジェクトのメソッドです。
クライアントサイドで使う場合は window. をつけたものに読み替えてください。(例 : setTimeout → window.setTimeout)

タイマーの設定

setTimeout

タイマー機能で最も基本的な関数は setTimeout() です。 これは指定した時間がたった後に関数を実行します。
  setTimeout(func, delay [, arg0, arg1, ...])
delay が指定する時間で ミリ秒 で設定します。 以下の例では 5 秒後にログを出力します。
 setTimeout(() => {
    console.log('Timeout');
 }, 5000);
実行する関数が引数をとる場合には delay の後に引数を渡します。
 setTimeout((a, b) => {
     console.log('Timeout', a, b); // Timeout foo bar
 }, 5000, 'foo', 'bar');
ただ、無名関数を使う場合はクロージャーの機能で変数を持たせることができるので、使う必要はないです。

setInterval

setTimeout() では渡した関数を一回実行して終わりですが、 setInterval() の場合は指定した間隔で繰り返し呼び出します。 それ以外は setTimeout() と同じです。
  setInterval(func, delay [, arg0, arg1, ...])
以下の例では 1 秒間隔でログを出力します。 ただ、これを本当に実行すると止まらなくなります。
 setInterval(() => {
     console.log('Interval');
 }, 1000);

タイマーの解除

設定したタイマーを解除する場合、各関数に対応した clearXxxx() の関数を呼び出します。
  clearTimeout(timeoutID)
  clearInterval(intervalID)
解除関数にはタイマーの ID となるオブジェクトを渡す必要があります。 これは各設定関数の戻り値です。
前章のサンプルでは setInterval() の関数は止まりませんでしたが、 次の例では 5 秒後に止まります。
 var intervalID = setInterval(() => {
     console.log('Interval');
 }, 1000);
 
 setTimeout(() => {
     clearInterval(intervalID);
 }, 5000);
ちなみに、無名関数を使わずに短く書くと次のようになります。
 setTimeout(clearInterval, 5000,
            setInterval(console.log, 1000, 'Interval'));

非同期呼び出し setImmediate

setImmediate() は指定した関数をすぐに(Immediately) 実行します。
  setImmediate(func, [, arg0, arg1, ...])
以下の例ではすぐにログを出力します。
 setImmediate(()=>console.log('Immediate'));
setImmediate() は setTimeout で 0 秒を設定したものに相当します。 ただ、相当はするのですが、 setTimeout(..., 0) と同じでもありません。
setTimeout() には制限があって、最小遅延(4,5ns 程度)が必要なので、すぐに実行したい場合には setImmediate() の方を使います。

タイムアウト時間を設定しない setImmediate() はなぜ必要なのでしょうか?

これは "すぐ" といっても、本当に "すぐ" ではないところがポイントです。
setImmediate() を実行すると、すぐに処理を返します。ここは本当にすぐです。その後、一連の処理が終わってから、指定した関数を実行します。 つまり、 関数を非同期に呼び出すことになります。

例えば、ボタンなどをクリックした後の処理ではすぐに処理を返さないと固まってしまいます。 そこで時間のかかる処理を行うことはユーザビリティーを悪化させます。
そこで、実行時間の長い処理は setImmediate() に設定して、一旦処理を返します。 ブラウザーはレイアウトや描画などの未処理の作業を処理してから、その時間のかかる処理を実行するようになります。

サンプルコード

記事で使用したサンプルコードは以下のリンクから取得(名前をつけて保存)できます。 これを node コマンドの引数に渡して実行します。
$ node timer.js 


関連記事
スポンサーサイト
Prev.    Category    Next 

Facebook コメント


コメント

コメントの投稿

Font & Icon
非公開コメント

このページをシェア
アクセスカウンター
アクセスランキング
[ジャンルランキング]
コンピュータ
24位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
3位
アクセスランキングを見る>>
カレンダー(アーカイブ)
プルダウン 降順 昇順 年別

02月 | 2017年03月 | 03月
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -


はてな新着記事
はてな人気記事
ブロとも申請フォーム
プロフィール

yohshiy

Author:yohshiy
職業プログラマー。
仕事は主に C++ ですが、軽い言語マニアなので、色々使っています。

はてブ:yohshiy のブックマーク
Twitter:@yohshiy

サイト紹介
プログラミング好きのブログです。プログラミング関連の話題や公開ソフトの開発記などを雑多に書いてます。ただ、たまに英語やネット系の話になることも。