JavaScript の async/await

async/await は Promise を簡潔に扱うための構文です。非同期処理を「同期コードの形」で書けるため、業務コードでも標準的に使われます。

基本

async を付けた関数は必ず Promise を返します。await は Promise の完了までその行で停止しますが、実際にはイベントループに制御が戻るだけでスレッドは止まりません。

async function run() {
  const res = await fetch('/api')
  const data = await res.json()
  return data
}

エラー処理

try/catch と組み合わせることで、Promise.then().catch() より管理しやすくなります。

async function loadUser() {
  try {
    const r = await fetch('/user')
    return await r.json()
  } catch (e) {
    console.error(e)
    return null
  }
}

並列化

await を順番に並べると直列実行になります。独立した処理は Promise.all でまとめて並列化します。

// 非効率
const a = await fetch('/a')
const b = await fetch('/b')

// 効率的
const pa = fetch('/a')
const pb = fetch('/b')
const [a2, b2] = await Promise.all([pa, pb])

await の動作

await は実行をブロックしません。Promise が解決されるまでイベントループに戻り、その後マイクロタスクとして再開されます。DOMContentLoaded と load の関係にも類似点があります。

まとめ

  • async は Promise を返す関数になる
  • await は Promise の完了まで処理を一時停止する
  • try/catch と相性がよい
  • 独立タスクは Promise.all で並列化
  • 実際のスレッドは止まらない(イベントループで復帰)