JavaScript運行メカニズム:Event Loop


JavaScriptは単スレッド言語です.単一スレッドは並ぶ必要があり、前のタスクが完了すると次のタスクが実行されます.したがって、タスクは二つの種類に分けられます.同期タスクと非同期タスクです.
  • 同期タスクとは、メインスレッド上に整列して実行するタスクのことで、前のタスクだけが実行されて、次のタスクが実行されます.
  • 非同期タスクとは、メインスレッドに入らずに「タスクキュー」に入るタスクであり、タスクキューのみがメインスレッドに通知され、ある非同期タスクが実行され、このタスクがメインスレッドに入ります.
  • 異なるタスクソースは異なるTaskキューに割り当てられます.タスクソースは、マイクロタスクとマクロタスクに分けられます.
  • マクロタスク:全体コードscript、setTimeout、set Interval
  • を含む.
  • マイクロタスク:Promise.then(非new Promise)、プロcess.nextTick(node中)
  • 非同期実行の実行メカニズムは以下の通りである.
  • のすべての同期タスクは、メインスレッド上で実行され、これはマクロタスクに属し、実行スタックを形成する.マクロタスクを先に実行する
  • メインラインの他に、タスクキューがあります.非同期タスクは、実行結果があれば、タスクのキューにイベントを配置します.
  • は、スタック内の全同期タスクの実行が完了すると、システムはタスクキューを読み出し、対応する非同期タスクを実行スタックに入れ、マイクロタスク
  • の実行を開始する.
  • メインスレッドは、上記の第3ステップを繰り返しています.
  • メインラインのプログラム群でイベントを読み込みます.このプロセスは繰り返しますので、このような運行メカニズムはEvent Loop(イベントサイクル)とも呼ばれます.
    非同期タスクを置くイベント以外に、タイミングイベントをタスクキューに置くこともできます.タイマー機能は主にsetTimeout()とsetInterval()の2つの関数によって完成されています.それらの内部運行メカニズムは完全に同じです.前者が指定したコードは1回で実行され、後者は繰り返し実行されます.
    	console.log('1');
    	setTimeout(function() {
         
    	    console.log('2');
    	    process.nextTick(function() {
         
    	        console.log('3');
    	    })
    	    new Promise(function(resolve) {
         
    	        console.log('4');
    	        resolve();
    	    }).then(function() {
         
    	        console.log('5')
    	    })
    	})1
    	2
    	4
    	3
    	5
    
    
    	1.        console.log('1'),   
    	2. setTimeout,     Event Queue,       ,         
    	3.          ,      ,    Event Queue    setTimeout     
    	4.     console.log('2'),  process.nextTick,     Event Queue
    	5. new Promise,    console.log('4'),  then,     Event Queue
    	6.        ,        ,   process.nextTick,    Promise.then
    	7.        ,         ,       ,