Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
非同期処理の迷宮を抜ける: 初学者がつまづく構造的な原因
Search
PADAone
November 28, 2025
Programming
2
840
非同期処理の迷宮を抜ける: 初学者がつまづく構造的な原因
PADAone
November 28, 2025
Tweet
Share
More Decks by PADAone
See All by PADAone
部分型について探ってみよう
pd1xx
2
450
Other Decks in Programming
See All in Programming
What Spring Developers Should Know About Jakarta EE
ivargrimstad
0
260
grapheme_strrev関数が採択されました(あと雑感)
youkidearitai
PRO
1
210
AI活用のコスパを最大化する方法
ochtum
0
120
社内規程RAGの精度を73.3% → 100%に改善した話
oharu121
13
7.7k
maplibre-gl-layers - 地図に移動体たくさん表示したい
kekyo
PRO
0
210
Docコメントで始める簡単ガードレール
keisukeikeda
1
100
日本だけで解禁されているアプリ起動の方法
ryunakayama
0
370
encoding/json/v2のUnmarshalはこう変わった:内部実装で見る設計改善
kurakura0916
0
350
どんと来い、データベース信頼性エンジニアリング / Introduction to DBRE
nnaka2992
1
230
AIコーディングの理想と現実 2026 | AI Coding: Expectations vs. Reality 2026
tomohisa
0
1.2k
15年目のiOSアプリを1から作り直す技術
teakun
1
610
オブザーバビリティ駆動開発って実際どうなの?
yohfee
3
740
Featured
See All Featured
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.3k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
81
Chasing Engaging Ingredients in Design
codingconduct
0
130
Designing for humans not robots
tammielis
254
26k
Why Our Code Smells
bkeepers
PRO
340
58k
Between Models and Reality
mayunak
2
230
Everyday Curiosity
cassininazir
0
150
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
64
53k
How to make the Groovebox
asonas
2
2k
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
1
1.3k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
55k
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.8k
Transcript
非同期処理の迷宮を抜ける 初学者がつまずく構造的な原因 Forkwell Library #115
イントロ 自己紹介 name: PADAone work: フロントエンドエンジニア activity: オープンソースのドキュメント活動 Zenn MDN
Web Docs Nushell Docs サバイバルTypeScript JavaScript Primer Obsidian hobby: ジム/ 銭湯/ ターミナル改造 最近気になっていること 型理論 圏論 / 代数学 RDB 理論 / 関係代数 関数型DDD Koka 言語 (Effect system) Async Effect / Structured Asynchrony SD(2023):9 月号2 章 本書籍 3-2
今日のゴール 非同期処理が「なぜ難しいのか」を知ってもらう 典型的なトラップを「目的・仕組み・用語」の3 視点で整理 迷わない学習ルートとチェックポイントを持ち帰る
何故、この書籍で非同期処理の記事を書いたのか?
始まりは 時は2022 年頃、 記憶がおぼろげだが 以下のようなTypeScript の非同期処理コードを理解しようとしていた 当時JavaScript については適当にググって個人サイトの記事で勉強をしたことがあるような状態 つまりほぼ知らない状態で、TypeScript については全くの初心者だった
type User = { id: number; name: string; }; async function fetchUser(id: number): Promise<User> { const res = await fetch(`/api/users/${id}`); const json = await res.json(); return json; } async function main() { const user = await fetchUser(1); console.log(user.name); }
とりあえずTypeScript の勉強してみる サバイバルTypeScript の非同期処理の章 当時はChatGPT もまだ出ていなかったぐらいだったので、ウェブで検索して良さそうなドキュメントを読ん でみるという行為をしていた。 ちょうど検索結果の上位にでできていた「サバイバルTypeScript 」の非同期処理の章を読む事から始めた。 👉
結果: 全然わからん( 挫折) 型ってなに? 文法についての知識がまったくない
JavaScript の独学 👉 JavaScript の基本が分かった! (azu さんに感謝)
非同期処理の壁にぶち当たる 🤔 非同期処理ってのがあるのか、でもよく分からないな そこでPromise について調べる… 👉 Promise 分かってきたカモ
実行順序がなぜこうなるのかがわからない この時期から、様々な海外の記事は動画に手を伸ばし始める 以下の動画で「イベントループ」という概念に出会う 👉 ようやくJS のランタイムモデルと非同期処理の全体像が見えた 見る What the heck
is the event loop anyway? | Philip Robert What the heck is the event loop anyway? | Philip Robert… … 共有 共有
Zenn で記事書いた 非同期処理が理解できない理由はこれだろ、というような https://zenn.dev/estra/articles/js-async-programming-roadmap 👉 結果: 初のバズ記事 『そうだ、学習していった内容を更新していけばより理解できるはず』 色々な記事や動画を調査しまくって内容を反映していけば完全な理解に到達できるはず!
そしてZenn で本を書いた
いつの間にかSD で記事書いていた SD(2023):9 月号2 章 本書籍 3-2
非同期処理はカジュアルに書けるけど… async/await で手続き的にかけて一見シンプル しかし動作を正しく語るには様々な知識が不可欠 であるが、それを事前に知ることが難しい 初学者は「動く」ことと「理解する」ことのギャ ップで迷子になってしまう type User =
{ id: number; name: string }; async function fetchUser(id: number): Promise<User> { const res = await fetch(`/api/users/${id}`); return res.json(); } async function main() { const user = await fetchUser(1); console.log(user.name); }
学習上のトラップ(書籍では8 つのポイント) 例えば… async/await が伝播して使われるため何故必要なのかが分かりづらい シンタックスだけ覚えても動作モデルが見えない 異なる仕組みを持つ非同期API をひとまとめにされて混乱しがち 用語・訳語がバラバラで誤解しやすい ランタイムや環境ごとの差異を無視しがち
3 つの観点に圧縮したトラップ 1. 非同期処理のシンタックスを書く目的があいまい 2. 理解に必要な情報が多く学習ルートが霧の中 3. 用語や訳語の罠に混乱させられる
観点1: 目的があいまい JavaScript は言語レベルでシングルスレッド UI スレッドやメインスレッドをブロックしないために非同期API を使う ゴールは「ノンブロッキングでIO 等を進め、後続処理を制御する」こと つまり、目的は非同期API
の利用
言語機能 vs 環境API Promise/async 関数は ECMAScript の機能 setTimeout や fetch
は 環境の機能(API) 同じ「非同期」に見えても実装も挙動も別物 console.log('[1]'); setTimeout(() => console.log('[3]'), 0); // タスク Promise.resolve().then(() => console.log('[2]')); // マイクロタスク
非同期API の分類 タスクベース: setTimeout , setInterval マイクロタスク直投入: queueMicrotask , MutationObserver
Promise-based: fetch , Blob.text など 仕組みが違うと実行タイミングも違う → キューを意識
観点2: 学習ルートが霧の中 シンタックス(型, Promise チェーン, async-await )だけでは実は情報が不十分 環境知識が必須 ランタイムモデル( コールスタックとイベントループ)
タスク/ マイクロタスク/ キューの優先順位 ECMAScript と環境が提供するAPI (ブラウザ, Node, Bun, Deno 等)の境界 ブラウザ環境ならレンダリングパイプラインの知識
None
イベントループの共通ルール タスク1 つ処理 → 直後にマイクロタスクを全て処理 タスクキューは複数、選択規則は環境依存 マイクロタスクキューは基本的に1 つで高優先度 while (tasksAreWaiting())
{ // すくなくても1つ以上のタスクキューから( 環境定義のルールで) 1つのタスクキューを選ぶ taskQueue = getTaskQueue(); // 1つのタスクを処理する task = taskQueue.pop(); execute(task); // 1つのマイクロタスクキューにあるすべてのマイクロタスクを処理する while (microtaskQueue.hasTasks()) { microtask = microtaskQueue.pop(); execute(microtask); } }
観点3: 用語の罠 concurrency (並行)と parallelism (並列)は別物 blocking と non-blocking で理解する
async 関数と「非同期関数」という一般語を混同しない なるべく訳語より原文で確認する習慣を
同期API vs 非同期API 同期API: ブロッキングで流れは単純 非同期API: ノンブロッキングで効率的だが流れが 見えにくい まず「ブロックする/ しない」で整理すると理解が
進む 上記はDeno 環境のAPI 例 // 同期API (ブロッキング) const data = Deno.readTextFileSync(path); console.log(data); // 非同期API (ノンブロッキング) Deno.readTextFile(path) .then((data) => console.log(data)); console.log(' 次の処理へ');
迷わないためのチェックポイント 目的: どの非同期API で何をノンブロックにしたい? 仕組み: キュー種別とイベントループの挙動を利用する環境で確認 用語: concurrency/parallelism/asynchronous を英語で整理
ヤッター! これで非同期処理の迷宮を抜けられる!
並行処理の広大な世界 非同期処理は大きくは並行処理のテーマに含まれる この迷宮を抜けた? 先には更に広大な迷宮世界が広がっている アプリケーション層 TypeScript/ フレームワーク ランタイムシステム層: OS や、システムコール(kqueue/epoll/IOCP)
非同期IO/ 同期IO の仕組み 環境に含まれる libuv, Tokio(mio) 等 C や Rust などのシステムレベル言語 ハードウェア層: CPU 、メモリ、キャッシュ, I/O デバイス
END ありがとうございました