JS

async/await

中級

読み方:アシンクアウェイト|英語:Async Await

非同期処理を同期的に書ける構文で、Promiseをより読みやすく扱えるよ。

やさしい説明

async/awaitは、非同期処理を「上から順番に」読めるように書ける構文です。Promiseの .then() チェーンより読みやすくなります。

async を関数の前につけると「この関数は非同期処理を含むよ」と宣言できます。await を使うと「この処理が終わるまで待ってから次に進む」と書けます。

エラー処理は try-catch で書けるので、同期処理と同じ感覚でコードが書けます。

具体例・使い方

// .then()チェーン(ネストが深くなりやすい)
fetch(url)
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => console.error(err));

// async/await(同じ処理・はるかに読みやすい)
async function getData() {
  try {
    const res = await fetch(url);
    const data = await res.json();
    console.log(data);
  } catch (err) {
    console.error("エラー:", err);
  }
}

複数の非同期処理を並列実行する

// 直列(1つずつ待つ → 遅い)
const user = await fetchUser(id);
const posts = await fetchPosts(id); // userを待ってから実行

// 並列(Promise.allで同時に実行 → 速い)
const [user, posts] = await Promise.all([
  fetchUser(id),
  fetchPosts(id),
]);
// 両方完了してから次に進む

互いに依存しない複数のAPI呼び出しは Promise.all() で並列実行すると速くなります。直列に書いてしまうと待ち時間が2倍になるため、独立した処理は並列化を意識しましょう。

いつ使う?

  • APIからデータを取得するとき(fetch)
  • データベースにアクセスするとき(Node.js)
  • ファイルの読み書きをするとき
  • Promise を返す関数を呼び出すとき全般

間違いやすいポイント

❌ await を async 関数の外で使う

awaitasync 関数の中でしか使えません(トップレベルawaitはES2022以降のモジュールで使えますが、通常の関数内では不可)。

// ❌ async関数の外ではawaitは使えない
const data = await fetch(url); // SyntaxError!

// ✅ async関数の中で使う
async function load() {
  const res = await fetch(url); // OK
  return res.json();
}

❌ try-catch を省略してエラーを握りつぶす

async 関数内でエラーが発生しても try-catch がないと、呼び出し元で気づけないことがあります。APIを呼ぶ処理には必ずエラーハンドリングを書きましょう。

よくある疑問

Q: asyncとawaitの役割は?

A: asyncは「この関数は非同期です」と宣言、awaitは「この処理が終わるまで待つ」という意味です。セットで使います。

Q: エラー処理はどうする?

A: try { await fetch(...) } catch (e) { console.error(e) } のようにtry-catchで囲みます。

Q: async関数の戻り値は?

A: 常にPromiseを返します。return 5 と書いても、呼び出し側では await fn() で受け取る必要があります。

関連用語

  • Promise — async/await の土台。async関数はPromiseを返す
  • fetch — async/awaitと最もよく組み合わせるAPI通信の関数
  • try-catch — async/await のエラー処理に使う構文
  • コールバック — async/awaitが登場する前の非同期処理の書き方

📖 関連レッスン

レッスンを見る →

関連ブログ記事

⚠️ 関連するエラー

❓ 関連するQ&A