JavaScriptイベント駆動機構&タイマー機構


ブラウザでは、イベントは極めて重要なメカニズムとして、JavaScriptがユーザ操作とDOMの変化に応答する能力を与える.NodeJSでは,非同期イベント駆動モデルは合併能力を高める基礎である.
一、プログラムはどのようにイベントに応答しますか?
プログラムが外部のイベントに応答する方法は2つあります.
1.中断
操作システムのキーボードなどのハードウェア入力は中断によって行われます.この方式の利点はマルチスレッドがなくても安心してコードを実行できます.CPUは割り込み信号を受信したら自動的に中断処理プログラムを実行します.処理が完了すれば元のコードの実行環境に戻ります.このような方法はハードウェアのサポートが必要で、一般的にはオペレーティングシステムによって実装されます.
2.ポーリング
ループ検出は、イベントが発生しているかどうか、あれば対応する処理プログラムを実行します.これは下の層と上の層の開発に応用されています.
ポーリング方式の欠点の一つは、メインスレッドのメッセージサイクルで時間をつぶして操作すると、プログラムが新しいメッセージにすぐに応答できなくなるということです.
二、JavaScriptにおけるタイマー機能の特徴
Nodeにしてもブラウザにしても、setTimeoutとsetIntervalという二つのタイマー関数があり、その仕事の特徴はほぼ同じです.
JavaScriptのタイマーは、コンピュータの下のタイミング中断とは異なります.中断が来たら、現在実行コードが中断され、タイミング中断処理関数を実行します.JavaScriptのタイマーは、現在実行されているスレッドのコードがない場合、対応するコールバック関数を実行します.現在コードが実行中の場合、JavaScriptエンジンは現在のコードを中断せずに回転してリプライを実行したり、新しいスレッドを開いてリプライを実行したりしません.現在のコードが実行されてから処理します.
console.time("setTimoutLabel");	//      
setTimeout(function() {
	console.timeEnd("setTimoutLabel");	//      
}, 100);
for (var i = 0; i < 100000; i++) { }
上記のコードを実行すると、最終的に出力される時間は100 ms程度ではなく、数秒程度となります.これはサイクルが完了する前に、タイミング・コールバック関数が実行されずにサイクル終了に延期されたことを示しています.実際にJavaScriptコードの実行中に、すべてのイベントは処理されません.現在のコードが全部完成するまで、新しいイベントを処理することができます.これは、ブラウザでJavaScriptコードを実行すると、ブラウザが応答を失う理由です.
三、タイマーの動作原理
1.javascriptエンジンはスレッドが一つしかないので、非同期イベントは列に参加して実行を待つしかない.
2.非同期コードを実行するとき、タイマーが実行中のコードによってブロックされたら、次に実行可能な時間が現れるまで待ちに列の尾部に入ります.setTimeoutとsetIntervalは本質的に区別されています.setTimeoutのコードは、各コールバック関数の実行後に少なくとも遅延が必要となります.しかし、set Intervalは「指定遅延ミリ秒値」ごとに、前回のコールバック関数がまだ実行されているかどうかにかかわらず、コールバック関数を実行しようと試みます.