Upgrade to Pro — share decks privately, control downloads, hide ads and more …

async await 結局、同期・非同期どっちなの?

Avatar for ike2525 ike2525
September 12, 2026
51

async await 結局、同期・非同期どっちなの?

大Funabashi\.dev(2026/09/12)で発表した資料になります。
https://funabashidev.connpass.com/event/398253/

Avatar for ike2525

ike2525

September 12, 2026

Transcript

  1. 同期処理とは 呼び出し側が呼び出し先の完了や応答を待って 次の処理に進むこと console.log("① 処理開始"); 出力 const data = fetchDataSync();

    ① 処理開始 console.log("② データ受け取り:", data); ② データ受け取り:(実際のデータ) console.log("③ 処理終了"); ③ 処理終了 4
  2. 非同期処理とは 呼び出し側が呼び出し先の応答を待たずに 呼び出し先と並行して先の処理を実行すること console.log("① 処理開始"); 出力 async function main() {

    ① 処理開始 const data = await fetchData(); console.log("③ データ受取、処理終了:", data); } ② 処理中... ③ データ受取、処理終了:(実際のデータ) main(); console.log("② 処理中..."); 5
  3. 新たな疑問 同期のコードを再度見てみると... console.log("① 処理開始"); const data = fetchDataSync(); console.log("② データ受け取り:",

    data); 非同期では、③が②に追い越した でも同期では、②と③が逆転しない... console.log("③ 処理終了"); なぜ、この現象が起こるのか?? 6
  4. ブロッキングとは 呼び出し先が完了するまで、 呼び出し側も他の作業ができないこと console.log("① 処理開始"); const data = fetchDataSync(); console.log("②

    データ受け取り:", data); console.log("③ 処理終了"); ここでブロッキングが発生 呼び出し側も含めて動けないため、 ②・③が逆転することはない 7
  5. ノンブロッキングとは 呼び出し先の完了を待たずに、 呼び出し側は他の作業ができること console.log("① 処理開始"); async function main() { const

    data = await fetchData(); ここがノンブロッキング console.log("③ データ受取、処理終了:", data); } main(); console.log("② 処理中..."); main()を待たずに、先に処理がされる 8
  6. 4象限にすると... ブロッキング 定番 同期 自分で確認するため、 その場を動けない レア 非同期 その場を動けないが、 相手から通知をしてくれる

    ノンブロッキング レア 自由に動けるが、 自分で確認する必要がある 定番 相手が通知してくれるので、 その間自由に動ける 10
  7. それを踏まえて... 処理のフロー console.log("① 処理開始"); async function main() { const data

    = await fetchData(); // ここだけ一時停止 console.log("③ データ受取、処理終了:", data); Ⅰ. ①のログを出力 Ⅱ. main()関数を開始 Ⅲ. dataが入るまで待機 ノン ブロッキング } Ⅳ. ②のログを出力 main(); Ⅴ. dataが完了の通知を受け取る console.log("② 処理中..."); 非同期 Ⅵ. ③のログを出力 待っているのは、その関数の"中"だけ 呼び出し元を含めた外側は、待たずに動き続けている 12
  8. await の有無を比較すると... ある場合 ない場合 async function main() { async function

    main() { const data = await fetchData(); // awaitあり const data = fetchData(); // awaitなし console.log(data); console.log(data); } } main(); main(); console.log("loading…"); console.log("loading…"); 出力: loading… 出力: Promise { <pending> } (データ) 正常に中身を出力 loading… 中身を待たずに 先に出力 14