ホーム ›
エラー解決 › JavaScript › await is only valid in async
JavaScript ERROR
JavaScript await is only valid in async functions の原因と解決法
awaitを「asyncが付いていない普通の関数」の中で使うと発生するエラーです。関数の頭にasyncを付ければ解決します。
このエラーメッセージ
Uncaught SyntaxError: await is only valid in async functions and the top level bodies of modules
原因
- awaitを使っている関数にasyncを付けていない
- コールバック関数(forEachの中など)にasyncを付け忘れている
- モジュールでない通常スクリプトのトップレベルでawaitを使っている
❌ エラーになるコード
NG
function getData() {
const res = await Promise.resolve("データ取得完了");
console.log(res);
}
getData();
✅ 修正したコード
OK
async function getData() {
const res = await Promise.resolve("データ取得完了");
console.log(res);
}
getData();
▶ 修正済みコードを実行エディタで開く
progoのJavaScript実行環境(インストール不要・登録不要)でその場で動作を確認できます。
解決のポイント
awaitはasyncを付けた関数の中でのみ使えます。アロー関数ならasync () => {...}のように書きます。forEachのコールバックにasyncを付けても完了を待てないため、順番に待ちたい場合はfor...ofループを使うのが定石です。
よくある質問
async関数の戻り値はどうなる?
必ずPromiseになります。呼び出し側で結果を使うにはawaitするか.then()で受け取ります。
トップレベルでawaitは使えない?
type="module"のスクリプトやESモジュール内ならトップレベルawaitが使えます。通常のscriptタグでは関数で包む必要があります。