JavaScript Promise 戻り値:非同期処理の成功と失敗を扱う
「JavaScript Promise 戻り値」は、非同期処理の結果を扱うための重要な仕組みです。Promiseオブジェクトは、非同期処理の成功(または失敗)と、その結果の値を表します。then
メソッド、catch
メソッド、そしてfinally
メソッドを効果的に使用することで、非同期処理をスムーズに制御し、可読性の高いコードを実現できます。
Promiseの基礎:状態と戻り値
Promiseは、以下の3つの状態を持ちます。
- pending (待機): 初期状態であり、非同期処理がまだ完了していない状態。
- fulfilled (履行): 非同期処理が成功し、
resolve()
関数に渡された値が戻り値となる状態。 - rejected (拒否): 非同期処理が失敗し、
reject()
関数に渡された理由が戻り値となる状態。
Promiseがfulfilled
またはrejected
の状態になると、それぞれ対応するthen
やcatch
メソッドのコールバック関数が実行されます。
thenメソッド:成功時の処理と戻り値
then
メソッドは、Promiseがfulfilled
になった場合に実行されるコールバック関数を登録します。このコールバック関数は、resolve()
に渡された値を引数として受け取ります。また、then
メソッド自体も新しいPromiseを返すため、メソッドチェーンでつなげることができます。
この例では、最初のthen
で受け取った戻り値('成功!'
)が次のthen
に渡され、次の処理が実行されます。
then
メソッドの戻り値の活用
then
メソッドのコールバック関数の戻り値は、次のthen
メソッドに渡されます。これにより、非同期処理が連続して行われ、結果を次々と渡すことができます。もし戻り値がPromiseであれば、そのPromiseが解決されるまで次のthen
の処理は待機します。
catchメソッド:失敗時の処理
catch
メソッドは、Promiseがrejected
になった場合に実行されるコールバック関数を登録します。このコールバック関数は、reject()
に渡された理由(エラーメッセージなど)を引数として受け取ります。
catch
メソッドは、非同期処理の失敗時にエラーハンドリングを行い、エラー内容を表示するために使用されます。
finallyメソッド:成功・失敗に関わらず実行される処理
finally
メソッドは、Promiseがfulfilled
またはrejected
になった場合に必ず実行されるコールバック関数を登録します。finally
の中では引数は渡されず、成功か失敗かに関係なく必ず実行される処理を記述します。
finally
は、例えば「ローディング中の表示を消す」「リソースを解放する」といった、処理結果に関係なく必ず行いたい後処理を実行するのに適しています。
Promise.all:複数のPromiseの戻り値をまとめて取得
Promise.all
メソッドは、複数のPromiseを並列に実行し、すべてのPromiseがfulfilled
になった場合に、それぞれの戻り値を配列として取得できます。いずれかのPromiseがrejected
になると、全体が失敗となり、その理由が返されます。
Promise.all
を使うことで、複数の非同期処理を並列で実行し、それらの結果を一度に処理できます。
Promise.race:最も早く完了したPromiseの戻り値を取得
Promise.race
は、複数のPromiseを並列に実行し、最初にfulfilled
またはrejected
になったPromiseの戻り値を取得します。いずれかのPromiseが最初に完了した時点で処理が進みます。
Promise.race
は、早い者勝ちのシナリオで便利です。
async/await:Promiseを同期的に扱う
async/await
構文を使うと、Promiseを同期的に扱うことができます。async
関数内でawait
を使うことで、Promiseの完了を待って、その戻り値を取得することができます。
await
はPromiseが解決されるまで待機し、結果を返します。これにより、非同期処理を直感的に書けるため、コードが簡潔で読みやすくなります。
まとめ
Promiseとthen
、catch
、finally
メソッド、Promise.all
、Promise.race
、そしてasync/await
を理解することで、JavaScriptの非同期処理を効果的に制御し、可読性と保守性の高いコードを実現できます。「JavaScript Promise 戻り値」をマスターすることで、より効率的で直感的な非同期処理が行えるようになります。
関連情報
さらに詳しい情報については、以下のリソースを参考にしてください:
よくある質問 (QA)
Q1: Promiseの戻り値はどのようにして確認できますか?
A1: then()
メソッドを使用して、成功した場合の戻り値を確認できます。
Q2: Promiseが拒否された場合、どうなりますか?
A2: catch()
メソッドを使用して、拒否された場合のエラーメッセージを処理します。
Q3: Promiseをどのようにチェーンすることができますか?
A3: then()
メソッドを連続して呼び出すことで、複数の非同期処理をチェーンすることができます。
その他の参考記事:promise 使い方