await is only valid in async functions
asyncではない関数でawaitを使用した場合のエラー
概要
asyncキーワードが付いていない関数内でawaitを使用した場合に発生するエラーです。awaitは非同期関数(async function)内でのみ使用できます。
エラーメッセージ
SyntaxError: await is only valid in async functions and the top level bodies of modules
SyntaxError: Unexpected reserved word
SyntaxError: 'await' expressions are only allowed within async functions
原因
- asyncの付け忘れ: 関数宣言にasyncがない
- コールバック関数: map/forEachなどのコールバックにasyncがない
- トップレベルawait: モジュールでない環境でのトップレベルawait
- アロー関数: アロー関数にasyncがない
- クラスメソッド: メソッドにasyncがない
解決策
1. 関数にasyncを追加
| |
2. アロー関数の場合
| |
3. コールバック関数の場合
| |
4. forEachでは使えない
| |
5. クラスメソッド
| |
6. トップレベルawait(ES Modules)
| |
7. IIFEパターン
| |
8. イベントハンドラ
| |
9. Promiseチェーンとの使い分け
| |
10. エラーハンドリング
| |
11. 並列実行
| |
12. TypeScriptでの型
| |
async/awaitのルール
| ルール | 説明 |
|---|---|
| await は async 内のみ | 通常の関数では使用不可 |
| async は Promise を返す | 常に Promise でラップされる |
| await は Promise を待つ | 非 Promise でも動作 |
| エラーは try-catch | または .catch() |
よくある間違い
- forEach内でawaitを使って順番通りに実行されると思う
- asyncを付けたら自動的に並列実行されると思う
- awaitなしでPromiseを返して、呼び出し側で待つのを忘れる
- async関数の戻り値が直接値だと思う(Promiseでラップされる)
関連エラー
参考リンク
JavaScript の他のエラー
この記事は役に立ちましたか?