前回
コールスタックとキュー
コールスタックは後入れ先出しの箱。後に入れれば入れるほど先に処理される。
同期的な考え方である。
しかし、setTimeoutのような非同期処理が入るとコールスタックとは別にキューが必要になる。
同期処理も非同期処理もまずは、コールスタックに積まれていく。
同期処理はそのまま処理されてコールスタックから抜けていくのだが、
非同期処理に渡された関数(コールバック関数)はコールスタック内で処理されずに
条件が満たされるまで隔離される。
そのあと、条件を満たしたらコールバックキューと言われるところにコールバック関数は移される。コールバックキューは先入れ先出しで、コールスタックが空になるまで待機する。スタックが空くと、入れる。これはイベントループによるものでコールスタックが空の場合、タスクキュー内のタスクをコールスタックへ取り出す。
では先ほどの例1の処理だと、
①1が出力(コールスタックで処理)
②setTimeout実行(コールスタックで処理後funcAを隔離)
③4出力(コールスタックで処理)
④(funcAは条件を満たすまで待機)1秒後funcAが実行(キューの中でスタックが空くのを待つ)→(スタックが空く)funcAが実行
⑤textが実行→funcBが実行(コールスタックで処理)
⑤2が出力(コールスタックで処理)
⑥funcB終了→funcAの続きを実行(コールスタックは後入れ先出し)
⑦3が出力(コールスタックで処理)
Promiseやasync,awaitはそんな非同期処理が入るとコードの可読性が落ちるのを防ぐために作られた。