🧑‍💻

【JavaScript・TypeScript】非同期処理を理解したい

2024/01/07に公開

はじめに

フロントを業務として触り初めて、半年くらい経ちました。
少しずつ、理解できてきて「フロント楽しいかも?」と思ったのをきっかけに、つよつよフロントエンジニアを目指して、アウトプットしていきます。

まずは、説明しろと言われると「うーん」となってしまう、非同期処理から学習していきます!

そもそも非同期処理ってなに?

一言で言うと「裏側でいろいろやってくれる処理のこと」です。

ただイメージが湧かないので、非同期処理を理解するには、JavaScript・TypeScriptの処理がどのように進むかを理解する必要があります。

JavaScript・TypeScriptはシングルスレッドで動く

シングルスレッドではプログラムが動く場所は「1つ」ということです。

カレーとサラダを作る場合で、イメージするとこんな感じでしょうか?
※間違ってたらごめんなさい

◎シングルスレッド
シェフ1人、キッチン1つで作る

◎マルチスレッド
シェフ2人、キッチン2つで作る

シングルスレッドだと何が困るのか?

では、シングルスレッドだと何が困ってしまうのか?
それは、「時間がかかる処理は待たなければならない」ということが起きてしまいます。

同じくカレーとサラダを作る場合でイメージしてみます
◎シングルスレッドでカレーを作る場合
1.人参を切る
2.玉ねぎを切る
3.じゃがいもを切る
4.具材を炒める
5.具材を煮る
6.ルーを入れて煮る
7.サラダを作る
8.完成

上記のようなプログラムで作るとき、時間がかかる処理は「具材を煮る」部分です。
「具材を煮る」より下にある処理は「具材を煮る」が完了してからでないと実行できないのです。
シェフは「具材を煮る」が完了するまでずっと待っている状態になります。

実際のプログラムで時間がかかる処理は
・API通信
・ファイルの読み書き
などがあります。

つまり、シングルスレッドで実行すると「ファイルの読み書き」が全て終わってから、次の処理が実行されるという事が起きてしまうので、アプリを使っているユーザーは長時間待たないと行けない状態になってしまいます。

ただ、本当は具材を煮ている間にサラダを作りたくなりませんか?その方が効率良いですよね。
1.人参を切る
2.玉ねぎを切る
3.じゃがいもを切る
4.具材を炒める
5.具材を煮る → 5.1煮てる間にサラダを作る
6.ルーを入れて煮る
8.完成

このように、JavaScript・TypeScriptは「非同期処理」を使って、時間がかかる処理があっても、時間がかかる処理は裏側でいろいろ処理してもらって、先にプログラムを実行させ、シングルスレッドの問題を回避しています。
1.人参を切る
2.玉ねぎを切る
3.じゃがいもを切る
4.具材を炒める
「5.具材を煮る(非同期処理させる)」 → 5.1煮てる間にサラダを作る
6.ルーを入れて煮る
8.完成

おわり

非同期処理の理解難しいですね。。。アウトプットしながら理解を深めていきたいと思います

Discussion