[JavaScript] PromiseでRejectもしくは例外が発生した場合のawait
はじめに
JavaScriptのPromise
は、await
を使えば大分わかりやすくなります。
筆者は、await
の動作を理解できていたと思っていました。
最近、await
で待っていたPromise
で例外が発生し、自分の認識と違う動作をしたので記事にしてみることにしました。
そもそも、例外が発生した場合だけでなく、Rejectされた場合に対する認識も間違っていました。
動作確認
Firefox: 100.0 (64 ビット)
JSFiddle: No-Library (pure JS)
コード
Resolveの場合
以下のようなコードの場合、f2
のresult
は、f0
が出力した値がそのまま出力されます。
これは、想定していた動作でした。
Rejectの場合
一方、Promise
がRejectされた場合は、以下のような出力を想定していましたが、何も出力されません。
f1: {"func":"f0","result":false}
f2: {"func":"f0","result":false}
その代わり、コンソールにUncaught (in promise) Object { func: "f0", result: false }
のようなメッセージが出力されます。
もっともこれは、await
の仕様通りで通常の動作です。
自分の認識が間違っていただけでした。
想定通りの動作をさせるためには、RejectされたをPromise
をcatchしなければいけません。
例えば、以下のように修正します。
ここでは、f1
しか修正していませんが、場合によってはf2
も修正する必要があります。
例外が発生した場合
例外を発生させてみます。
また、何も出力されなくなりました。
そして、コンソールにUncaught (in promise) Error: f0
と表示されています。
このメッセージだけだと例外が発生したのかRejectされたのか区別できません。
自分が書いたコードでなかったので、尚更わかりませんでした。
これを修正するには、例外が発生したのでtry/catch
文で処理する必要があります。
例えば、以下のようにします。
まあ、実際には、もう少しtry/catch
文で返す値なりを考えなければいけないと思いますが。
Discussion