🤤

JavaScriptの非同期処理の流れを理解する

2024/11/29に公開

JavaScriptの非同期処理は、イベントループやコールスタックなどの仕組みを理解することでスムーズに扱えるようになります。本記事では、その基本的な流れをわかりやすく解説します!

基本概念

1. コールスタック (Call Stack)

  • JavaScriptのエンジン(例: V8)は、同期的なタスクを実行するためのスタックを持っています。
  • 関数呼び出しが発生すると、スタックに積まれ、処理が完了するとスタックから取り除かれます。

2. Web APIs / タスクキュー

  • ブラウザやNode.js環境には、非同期処理を処理するためのWeb APIs(例: setTimeout, fetch)やタスクキューがあります。
  • 非同期処理が完了すると、関連するコールバックがタスクキューに登録されます。

3. イベントループ (Event Loop)

  • イベントループは、コールスタックが空になるのを待ち、タスクキューからコールバックを取り出してコールスタックに送ります。

4. マイクロタスクキュー (Microtask Queue)

  • マイクロタスクは、通常のタスクキューよりも優先度が高いです。Promiseのコールバックなどがここに入ります。

非同期処理の流れ

1. 同期処理の実行

  • スクリプトが最初に実行されると、すべての同期コードがコールスタックで順次処理されます。

2. 非同期タスクの登録

  • setTimeout, fetch, またはPromiseのような非同期処理は、Web APIsによって処理されます
  • 処理が完了した後、関連するコールバックがタスクキューまたはマイクロタスクキューに登録されます

3. イベントループの動作

  • イベントループは、コールスタックが空になるのを待ち、タスクキューまたはマイクロタスクキューからタスクをコールスタックに移します。
  • まずマイクロタスクキューのタスクが優先的に処理され、その後にタスクキューのタスクが処理されます。

具体例

以下のコードを例に具体的な流れを解説します。

console.log("Start");

setTimeout(() => {
  console.log("Timeout");
}, 0);

Promise.resolve().then(() => {
  console.log("Promise");
});

console.log("End");

1. 同期処理の実行

  • console.log("Start") がコールスタックに入り、"Start"が出力される。
  • 次に、setTimeoutが実行され、タイマーがWeb APIでセットされる。
  • Promise.resolve()が実行され、マイクロタスクキューに.thenコールバックが登録される。
  • 最後に、console.log("End") が実行され、"End"が出力される。

2. 非同期処理の実行

  • コールスタックが空になると、マイクロタスクキューの.thenコールバックが実行され、"Promise"が出力される。
  • 次に、タスクキューからsetTimeoutのコールバックが実行され、"Timeout"が出力される。

出力結果

Start
End
Promise
Timeout

まとめ

同期処理: コールスタックで即座に処理される。
非同期処理: Web APIsやタスクキューで管理され、イベントループによって処理される。
マイクロタスク: タスクキューよりも優先して処理される。
JavaScriptの非同期処理の仕組みを正しく理解することで、非同期タスクを効率よく制御できるようになります。次回は具体的なアプリケーションへの応用例も紹介していきます!


ぜひ、この記事が参考になったら「Like」や「フォロー」をお願いします!コメントでの質問も歓迎です! 😊
Happy Coding! 🚀

Discussion