Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】Then vs Await in JavaScript

2025年09月14日に「Dev.to」が公開したITニュース「Then vs Await in JavaScript」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

JavaScriptの非同期処理では、`then()`と`await`で時間の掛かる処理を効率的に扱う。`then()`はPromiseの結果をメソッドチェーンで処理し、`await`は`async`関数内で完了を待つ。`await`はコードが同期的に見え、可読性が高いため、ほとんどの場合に推奨される。複数の非同期処理を並行で行う際は、`Promise.all()`と`await`を組み合わせると効率が良い。

出典: Then vs Await in JavaScript | Dev.to公開日:

ITニュース解説

JavaScriptは、APIからのデータ取得やデータベースへの問い合わせのように、完了までに時間がかかる処理を効率的に扱うための仕組みを持っている。これは「非同期処理」と呼ばれ、特定の処理の完了を待っている間に、他の処理を止めることなく並行して実行できる特徴がある。もし同期的に、つまり順番に処理を進めてしまうと、時間のかかる処理が完了するまで次の処理が待たされ、ウェブサイトの表示が固まってしまうなど、ユーザー体験を損ねる原因となる。JavaScriptでは、この非同期処理をスムーズに管理するために「Promise(プロミス)」という仕組みが導入されている。Promiseは、未来のある時点で結果が返ってくることを約束するオブジェクトのようなものだ。非同期処理が成功した場合はその結果を、失敗した場合はエラー情報を、Promiseを通じて受け取ることができる。そして、このPromiseから返される結果やエラーをどのように扱うかを定義するのが、then()awaitという二つの主要な方法である。

then()メソッドは、Promiseが成功裏に完了し、結果が利用可能になったときにその結果を処理するために使用される。この方法は「Promiseチェーン」とも呼ばれ、複数の非同期処理を連続して実行したい場合に非常に役立つ。具体的には、ある非同期処理が完了したら、その結果を使って次の非同期処理を開始するといった一連の流れを、コードを繋げるように記述できる。then()の基本的な構文は、Promiseの後に.then()を記述し、その中に成功した場合に実行したい処理(コールバック関数)を指定する形である。例えば、ウェブサイトからJSONデータを取得する際に、まずデータ取得のPromiseが解決したら、その応答をJSON形式に変換する処理を.then()で繋げ、さらにそのJSONデータを使って何か別の処理を行うといった形で、一連のデータフローを構築できる。もし処理の途中でエラーが発生した場合は、.catch()メソッドを使ってそのエラーを捕捉し、適切な処理を行うことができる。この方法は、特に複数の処理が順番に依存している場合に、コードを読みやすく保つことができる利点がある。

一方、awaitキーワードは、非同期処理をより同期的な見た目で記述したい場合に用いられる。awaitは、その後に続くPromiseが解決するまで、そのawaitが書かれた行以降のコードの実行を一時的に停止させる。Promiseが成功裏に解決されると、その結果がawaitの左辺の変数に代入され、停止していたコードの実行が再開される。ただし、awaitを使用するには、そのコードが必ずasync関数(非同期関数)の内部でなければならないという重要な制約がある。async関数とは、キーワードasyncを関数の定義の前につけることで、その関数が非同期処理を含むことをJavaScriptに伝えるものである。awaitを使うことで、複雑な非同期処理の連鎖も、まるで通常の同期的なコードを記述しているかのように、上から下へと順番に実行されるような見た目にできるため、非常に読みやすく、理解しやすいコードになる。エラーハンドリングは、同期処理と同様にtry...catchブロックを使用することで、発生したエラーを捕捉し処理することが可能である。

then()awaitはどちらも非同期処理を扱うための強力なツールだが、いくつかの重要な違いがある。まず構文スタイルについて、then()はコールバック関数をベースにしたチェーン形式で記述するのに対し、awaitはより同期処理に近い、上から下に流れるような記述スタイルを提供する。エラーハンドリングの面では、then()は通常.catch()メソッドをチェーンの最後に追加してエラーを処理するが、awaittry...catchブロックを使ってエラーを捕捉するのが一般的である。可読性に関しては、then()はチェーンが深くなるにつれてコードが複雑になり、「コールバック地獄」と呼ばれる状態に陥る可能性がある。これに対し、awaitはコードが直線的に見えるため、一般的に理解しやすく、管理しやすいと評価される。使用できる範囲も異なり、then()はPromiseオブジェクトがあればどこでも使用できるが、awaitは必ずasync関数の中でしか使用できないという制約がある。

これらの非同期処理の管理方法は、現代のウェブアプリケーション開発において不可欠である。第一に、API呼び出しやデータベースクエリといった時間のかかる非同期操作を、効率的かつスムーズに処理できるからだ。これにより、アプリケーションが応答不能になるのを防ぎ、ユーザーに快適な体験を提供する。第二に、複雑なコールバックの入れ子構造(コールバック地獄)を避け、コードの可読性と保守性を大幅に向上させる効果がある。入れ子のコールバックはエラーの追跡やデバッグを非常に困難にするが、then()チェーンやawaitによる同期的な見た目のコードは、これらを解消する。第三に、必要な場合には複数の非同期操作を確実に順番通りに実行させることができ、データ処理の整合性を保つ上でも重要である。これらの理由から、then()awaitを適切に使いこなすことは、堅牢で効率的なアプリケーションを開発するための基礎となる。

then()awaitのどちらを選ぶかは、状況と個人の好みに依存するが、一般的な指針がいくつかある。then()は、複数のPromiseを単純なチェーンとして連結したい場合や、コールバックベースのライブラリと直接連携する際に適している。特に、async/awaitの仕組みがまだ利用できない環境や、コードベースの他の部分がthen()ベースで書かれている場合にも有用である。一方、awaitは、複数の非同期呼び出しを明確な順序で処理したい場合に強く推奨される。例えば、あるAPIからユーザー情報を取得し、そのユーザー情報を使ってさらに別のAPIからユーザーの投稿リストを取得するといった、依存関係のある一連の処理では、awaitを使うとコードが非常に分かりやすくなる。awaitは、まるで同期的なコードのように上から下へ読み進められるため、処理の流れを直感的に把握しやすいという大きなメリットがある。

ほとんどの場合において、非同期処理を記述する際にはawaitが推奨される。その主な理由は、awaitが提供する圧倒的な可読性と、デバッグのしやすさにある。コードが上から下へ流れるように見えるため、問題が発生した際にどこで何が起きているのかを特定しやすい。しかし、すべてのケースでawaitが最適というわけではない。複数の独立したPromiseを並行して解決したい場合、つまり、互いに依存しない複数の非同期処理を同時に開始し、すべての結果が出揃うのを待ちたい場合には、Promise.all()awaitを組み合わせる方法が最も効率的である。Promise.all()は、複数のPromiseを同時に実行し、すべてのPromiseが成功するまで待機し、その結果を配列として一度に返す。これにより、処理時間を短縮しつつ、結果をまとめて扱うことができる。具体的なベストプラクティスとしては、async関数内で順次実行する非同期タスクにはawaitを、Promiseのメソッドチェーンを利用したい場合やasync関数外でPromiseを扱う場合にはthen()を使用するのが良いとされている。最終的に、ほとんどの非同期操作には可読性の高いawaitを使用し、メソッドチェーンが適している場面ではthen()を、並行処理でパフォーマンスを向上させたい場合はPromise.all()awaitと組み合わせて使うのが現代的なJavaScript開発の標準的なアプローチである。

関連コンテンツ

【ITニュース解説】Then vs Await in JavaScript | いっしー@Webエンジニア