LoginSignup
0
0

非同期処理②

Last updated at Posted at 2023-06-11

前回

コールスタックとキュー

コールスタックは後入れ先出しの箱。後に入れれば入れるほど先に処理される。

同期的な考え方である。

しかし、setTimeoutのような非同期処理が入るとコールスタックとは別にキューが必要になる。

同期処理も非同期処理もまずは、コールスタックに積まれていく。

同期処理はそのまま処理されてコールスタックから抜けていくのだが、

非同期処理に渡された関数(コールバック関数)はコールスタック内で処理されずに

条件が満たされるまで隔離される。

そのあと、条件を満たしたらコールバックキューと言われるところにコールバック関数は移される。コールバックキューは先入れ先出しで、コールスタックが空になるまで待機する。スタックが空くと、入れる。これはイベントループによるものでコールスタックが空の場合、タスクキュー内のタスクをコールスタックへ取り出す。

では先ほどの例1の処理だと、

①1が出力(コールスタックで処理)

②setTimeout実行(コールスタックで処理後funcAを隔離)

③4出力(コールスタックで処理)

④(funcAは条件を満たすまで待機)1秒後funcAが実行(キューの中でスタックが空くのを待つ)→(スタックが空く)funcAが実行

⑤textが実行→funcBが実行(コールスタックで処理)

⑤2が出力(コールスタックで処理)

⑥funcB終了→funcAの続きを実行(コールスタックは後入れ先出し)

⑦3が出力(コールスタックで処理)

Promiseやasync,awaitはそんな非同期処理が入るとコードの可読性が落ちるのを防ぐために作られた。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0