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