JavaScript
async/awaitで待機されない
awaitを付け忘れている
こんな症状
awaitを書いたのに非同期処理の結果を待たずに次の行が実行される。async/awaitの使い方で起きやすいよ。
まず試す
非同期呼び出しに await が付いているか、関数に async が付いているか確認する。forEach 内の await は for...of に書き換える。
js
// ✅ 順番に待つなら for...of
for (const id of ids) {
const res = await fetch("/api/users/" + id);
console.log(await res.json());
}これで直らなければ、下の「自分のケース」を確認。
🔍 自分のケースはどれ?
- ✓await を付け忘れた
→ 非同期関数の呼び出しに await を付ける。 - ✓関数に async が無い
→ 関数宣言に async を付ける。 - ✓forEach の中で await した
→ forEach は待たない。for...of に書き換える(並列でよければ Promise.all)。
なぜ起きる?
関数にasyncを付けていない、awaitを付け忘れている、またはforEachの中でawaitを使っているよ。forEachはコールバック関数の戻り値(Promise)を待たないから、中でawaitを書いても並列実行されてしまうんだ。順番に実行したいならfor...ofを使う必要があるよ。
✕ エラーが起きるコード
async function loadUsers() {
const ids = [1, 2, 3];
ids.forEach(async (id) => {
const res = await fetch('/api/users/' + id);
console.log(await res.json());
});
console.log('完了'); // ← データより先に表示される!
}
// forEachはコールバックのPromiseを待たない✓ 直したコード
async function loadUsers() {
const ids = [1, 2, 3];
// ✅ 順番に待ちたいなら for...of
for (const id of ids) {
const res = await fetch('/api/users/' + id);
console.log(await res.json());
}
console.log('完了'); // 全部終わってから表示される
}✅ 直ったか確認
非同期の結果が出てから次の処理が実行される順序になればOK。
この解決法は役立ちましたか?
🔗 関連するエラー
- Uncaught TypeError: x.forEach is not a function — forEachできない値に対してforEachしている
- Uncaught TypeError: Cannot read properties of undefined (reading 'length') — undefinedに対して.lengthを読んでいる
- Uncaught ReferenceError: xxx is not defined — 変数・関数名のタイポ
- Uncaught TypeError: Cannot read properties of null (reading 'addEventListener') — 取得しようとしたHTML要素が見つかっていない
- 404 Not Found(スクリプトが読み込まれない) — script の src パスが間違っている
📖 この問題を学べるレッスン
✏️ 手を動かして練習
📝 関連ブログ記事
- プログラミングのエラーメッセージの読み方 — エラーの読み方を基礎から解説
- JavaScriptとは?初心者向けにわかりやすく解説 — 変数・関数・イベントの基本
- JavaScriptでボタンクリックを動かす方法 — ボタンクリック時の動作を解説