【ひどうきしょり】

非同期処理(async/await) とは?

最終更新:
💡 結果を待つ順序を、読みやすく書く

JavaScriptでPromiseの結果を扱うための構文。awaitが待つ範囲、処理の順序、複数処理のまとめ方、失敗への対応を解説します。

📌 このページのポイント
async/await:通信の結果を待つ例この関数の進行ほかの実行できる処理通信を開始結果や失敗をPromiseで表すawaitで待つ関数の続きは一時停止実行の機会制御を渡せる確定後に続きへ結果を使う/失敗を扱う重い計算を自動で別スレッドへ移す構文ではない
通信待ちの間に、その関数以外の実行できる処理へ制御を渡す例。独立した処理を先に開始してまとめて待つ方法と、非同期の構文は区別します。
ひよこ ひよこ
async/awaitは、待たずに動く仕組み?
ペンギン先生 ペンギン先生
結果を待つコードを読みやすく書く構文だよ。async関数はPromiseを返し、awaitはその関数の続きを一時停止する。処理が成功したら結果を受け取り、失敗したらエラーとして扱えるんだ。
ひよこ ひよこ
awaitで、アプリ全体が止まる?
ペンギン先生 ペンギン先生
その関数の続きが待つ間、ほかの実行できる処理へ制御を渡せるよ。たとえば通信の完了を待つ使い方がある。ただし、非同期の構文にしただけで、すべての処理が待ち時間なく動くという意味ではないんだ。
ひよこ ひよこ
重い計算も、asyncを付ければ大丈夫?
ペンギン先生 ペンギン先生
長い計算を同じ実行スレッドで続ければ、ほかの処理を止める原因になるよ。asyncやawaitは、その計算を自動で別スレッドに移す命令ではない。Node.jsでもイベントループ上の長い処理には注意するんだ。
ひよこ ひよこ
二つの通信は、順番にawaitするの?
ペンギン先生 ペンギン先生
後の処理が前の結果を必要とするなら、順番に進めよう。互いに独立しているなら、先に両方を開始してからPromise.all等で結果をまとめて待つ方法がある。非同期と、複数処理を同時に進めることは同じではないんだ。
ひよこ ひよこ
失敗したら、どうするの?
ペンギン先生 ペンギン先生
awaitする処理をtry/catchで扱う等、失敗したときの対応を書くよ。Promise.allはどれかが失敗すると失敗になるけれど、ほかの処理を自動で取り消すわけではない。必要な結果と失敗の扱いを決めよう。
もっと詳しく知りたい人へ

全部の結果を、失敗分も含めて知りたいときは?

Promise.allSettledはすべてが成功か失敗に確定するまで待ち、それぞれの状態を返します。Promise.allとは用途が違います。大量の処理を一度に開始してよいかは、相手の制限や実行環境の負荷も考えて判断します。

awaitは必ずasync関数の中に書く?

async関数内で使うほか、JavaScriptのモジュールではトップレベルのawaitも使えます。通常のスクリプト等とは条件が違うため、モジュール形式や実行環境を確認します。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「async/await」って出てきたら「非同期処理の結果を待つ順序を、読みやすく書く構文」と思えばだいたいOK!
📖 おまけ:英語の意味
「async / await」 = 非同期の関数 / 結果を待つ
💬 ここではJavaScriptの構文を説明します。非同期処理はasync/awaitだけに限らず、コールバックやPromiseのthen等で結果を扱う書き方もあります。

参考資料

← 用語集にもどる