JavaScript/非同期/Lesson 17
async / await — *非同期を同期のように*
45分·theory
このチャプター
3/3
async / await — *非同期を同期のように*
🎯 このlessonを読み終えたら
このlessonをすべて読み終えたら、以下の3つを自信を持って説明できるようになります。
- ▸✅ async / await が Promise の文法糖衣である理由
- ▸✅ forEach 内の await が動作しない理由 + for-of による解決策
- ▸✅ AbortController を使った fetch タイムアウトの実装
学習目標をチェックリストとして手元に置き、すべて答えられるようになったらlessonを閉じてください。
async / await
核心を一言で
async/await (ES2017) = Promise を同期コードのように記述するための文法。then チェーンよりはるかに読みやすい。モダン JS の標準。
比較
同期コードとほぼ同じ形。直線的に読めます。
2つのルール
1. await は async 関数の中でのみ使用可能:
2. async 関数は必ず Promise を返す:
エラー処理 — try-catch
then-catch の代わりに使い慣れた try-catch を使用。例外の流れが通常のコードと同じ。
並列処理 — 直列 await の落とし穴
リクエストが互いに独立しているなら、必ず並列化しましょう。
実践パターン — リトライ
トップレベル await — モジュールで
ES2022 以降、モジュールの最上位で await が使用可能:
Node.js・モダンブラウザ(モジュール)でサポート。エントリポイントをすっきりと書けます。
React コンポーネントで
まとめ
- ▸
async function+await Promise= 同期のような非同期 - ▸エラーは try-catch で処理
- ▸独立したリクエストは Promise.all で並列化
- ▸モダン JS の標準 — then チェーンはほぼ使わない
⚡ 実際に試してみよう — async / await + 直列 vs 並列
直列 await がなぜ遅いのか、Promise.all がなぜ速いのかを時間比較で確認しましょう。
✏️ JS 코드
📟 コンソール出力
▶ 実行ボタンを押してください
⚠️ ブラウザのサンドボックスで実行 — console.log()のみ対応、alert/fetchは不可
🤖 AI にこう依頼してみてください
このlessonの概念を理解すれば、AI に具体的に指示を出せます。漠然とした「直してください」ではなく、語彙を持ったリクエスト — それがトークン節約の出発点です。
- ▸「この forEach の中の await が動かないので、for...of または Promise.all に変えてください」
- ▸「この fetch に AbortController のタイムアウトを追加してください」
- ▸「この関数に try-catch と分かりやすいエラーメッセージを追加してください」
なぜこれがトークンを減らすのか
概念を知らないと、AI の回答を受け取っても「それは何ですか?」と再度質問しなければなりません。その「再質問」がトークンを消費します。概念を一度身につければ、会話が一度で完結します。
先に読むとよい概念: Promise