JavaScript | 非同期処理をブレークポイントで止める

JavaScript
スポンサーリンク

では、実務レベルでの API 連携+エラー処理のデバッグ手順を、ブラウザ開発ツールを使った具体例とともにまとめます。
非同期処理+Promise+fetch+try…catch を組み合わせた典型的なパターンです。


1. サンプルコード(実務風 API 連携)

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>API連携デバッグ実践</title>
</head>
<body>
<h1>API連携デバッグ実践</h1>
<button id="runBtn">API取得開始</button>

<script>
// ---------------------------
// 1. 非同期 fetch API 呼び出し関数
// ---------------------------
async function getUserData(userId) {
  try {
    const response = await fetch(`https://jsonplaceholder.typicode.com/users/${userId}`);
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    const data = await response.json();
    console.log("getUserData success:", data); // ← ブレークポイント
    return data;
  } catch (err) {
    console.error("getUserData error:", err); // ← ブレークポイント
    throw err; // 上位で再度キャッチ可能
  }
}

// ---------------------------
// 2. 複数 API を順番に呼ぶ処理
// ---------------------------
async function mainTask() {
  console.log("mainTask start");

  try {
    const user = await getUserData(1);
    
    // 2つ目の API を呼び出す(存在しない URL でエラー想定)
    const postsResponse = await fetch(`https://jsonplaceholder.typicode.com/invalid_endpoint`);
    if (!postsResponse.ok) throw new Error(`HTTP error! status: ${postsResponse.status}`);
    const posts = await postsResponse.json();
    console.log("Posts data:", posts); // ← ブレークポイント
  } catch (err) {
    console.error("mainTask catch:", err); // ← ブレークポイント
  }

  console.log("mainTask end");
}

// ---------------------------
// ボタンイベント
// ---------------------------
document.getElementById("runBtn").addEventListener("click", mainTask);
</script>
</body>
</html>
HTML

2. 実務的デバッグ手順まとめ

① ブレークポイントの設置

  • Sources タブで下記にブレークポイントを置く:
    • console.log("getUserData success:", data);
    • console.error("getUserData error:", err);
    • console.log("Posts data:", posts);
    • console.error("mainTask catch:", err);
  • 目的:成功/失敗どちらも値を確認して原因を特定できる

② Pause on exceptions の活用

  • Sources タブ右上の「⏸」アイコンをオン
  • これで catch される例外も含めて自動停止
  • 非同期処理のどの箇所でエラーが発生しているか一目で確認可能

③ Scope / Watch で変数追跡

  • Watch に user / posts / err を追加
  • ブレーク時にリアルタイムで中身を確認
  • async 関数のネストでも Scope タブで呼び出し元を追跡可能

④ Call Stack で処理の流れを理解

  • 非同期処理でも Promise や async 関数が呼ばれた順序が表示される
  • エラー発生箇所や、どの API 呼び出しで止まったかを正確に把握できる

⑤ ステップ実行で原因追跡

  • Step over:現在の行を実行して次へ
  • Step into:関数の中に入り詳細確認
  • Step out:関数の外に戻る
  • 非同期関数に対しても Step into async call を使うと、await 以降の処理を追える

⑥ エラーの再現と確認

  • 存在しない URL やネットワーク切断などを意図的に作る
  • 「Pause on exceptions」でどの行でエラーが発生しているか確認
  • Scope / Watch / Call Stack を使って変数や処理の流れを理解

⑦ Promise.all / 並列処理の場合

  • 並列 API 呼び出しで Promise.all を使う場合も、ブレークポイントを then / await 後に置く
  • エラーがどの Promise で発生したかを Scope や Call Stack で確認

⑧ 実務的Tips

  • console.log() は簡易チェック用、Scope / Watch が本格デバッグ
  • ブレークポイントは catch だけでなく成功処理にも置く
  • 非同期チェーンの途中でエラーが起きると、上位 try…catch でまとめて確認できる

💡 まとめると:

  1. ブレークポイントで成功/失敗の両方を確認
  2. Pause on exceptionsで例外を見逃さない
  3. Scope / Watch / Call Stackで変数・呼び出し順を追う
  4. Step over / Step intoで処理を1行ずつ追う
  5. 意図的なエラーで原因を理解・再現

これで 実務レベルの API 連携+非同期エラーのデバッグ が体系的に練習できます。

タイトルとURLをコピーしました