【いべんとるーぷ】
イベントループ とは?
最終更新:
💡 待っている間にも、実行できる処理を進める
イベントや処理の完了に応じて、実行する処理を選び、順に進める仕組み。ここではブラウザとNode.jsのJavaScriptを扱い、処理の実行と非同期の待ち時間を区別する。
📌 このページのポイント
- 同じイベントループ上のJavaScript処理は、基本的に一つずつ実行する
- 非同期I/Oの待機と、完了後にJavaScriptの処理を実行することは別
- ブラウザではタスクの実行後などにマイクロタスクのチェックポイントがある
- 重い同期処理や増え続けるマイクロタスクは、次の処理や画面更新を遅らせる
イベントループは何をしているの?
イベントや処理の完了に応じて、実行できる処理を選んで進めるよ。JavaScriptの処理を一つずつ実行しながら、通信などの待ち時間には別の処理を進められる。待機する仕組みと、完了後の処理を動かすことを分けて考えよう。
重い計算も自動で並列にしてくれる?
同じイベントループ上の長い同期処理は、ほかの処理を待たせるよ。非同期I/Oでも裏側の仕組みは処理によって違う。例えばNode.jsはOSの機能に加え、ファイルI/Oなどにワーカープールを使う。JavaScriptで重い計算を書くこととは別なんだ。
setTimeoutで0を指定したら、すぐ実行する?
現在の処理へ割り込んで実行する指定ではないよ。時間条件を満たしてから実行の機会を待つので、ほかの処理で遅れることもある。指定した時間ぴったりに動く保証はないんだ。
Promiseの処理は、タイマーより先なの?
もっと詳しく知りたい人へ
マイクロタスクを追加し続けたらどうなる?
ブラウザのチェックポイントでは、途中で追加されたものも含め、マイクロタスクのキューが空になるまで処理するよ。その処理が新しいマイクロタスクを追加し続けると、次のタスクや画面更新へ進む機会を遅らせる。Promiseを使ったことだけで重い処理が別スレッドへ移るわけではないんだ。
まとめ:ざっくりこれだけ覚えればOK!
「イベントループ」って出てきたら「イベントや処理の完了に応じ、実行できる処理を順に進める仕組み」と思えばだいたいOK!
📖 おまけ:英語の意味
「Event Loop」 = イベントを扱う繰り返し
💬 イベントや処理の完了に応じて、次に実行する処理を選び続ける仕組みを表す名前だよ。ブラウザとNode.jsでは具体的な処理の選び方が異なるんだ。