ホーム › エラー解決 › 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

原因

❌ エラーになるコード

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タグでは関数で包む必要があります。