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
作って理解するPromise / Let's try implementing Promise
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
shimataro
November 28, 2025
Technology
0
24
作って理解するPromise / Let's try implementing Promise
プロによる本気の攻略本『JavaScript/TypeScript実力強化書』 - FL#115
https://forkwell.connpass.com/event/375550/
shimataro
November 28, 2025
Tweet
Share
More Decks by shimataro
See All by shimataro
Single Executable Applicationsについて / About Single Executable Applications
shimataro
0
1.9k
パッケージ開発者の苦悩 -JavaScriptランタイム群雄割拠- / distress of package developer
shimataro
0
710
An introduction to Node.js
shimataro
0
300
KFDのススメ / About KFD
shimataro
3
830
Node.js v12のES Modules / ES Modules on NodeJS v12
shimataro
1
1.2k
おまいらちゃんとリソース解放してますか / Remember to close resources!
shimataro
2
1.2k
CJSとESMとnpmパッケージ / CommonJS and ES Modules and npm package
shimataro
0
820
BigInt あれこれ / overview about BigInt
shimataro
0
930
dynamic import あれこれ / dynamic import - overview and pitfalls
shimataro
1
840
Other Decks in Technology
See All in Technology
re:Inventで出たインフラエンジニアが嬉しかったアップデート
nagisa53
4
230
Oracle Cloud Infrastructure:2026年1月度サービス・アップデート
oracle4engineer
PRO
0
200
Zephyr RTOS の発表をOpen Source Summit Japan 2025で行った件
iotengineer22
0
300
Amazon ElastiCacheのコスト最適化を考える/Elasticache Cost Optimization
quiver
0
320
SREじゃなかった僕らがenablingを通じて「SRE実践者」になるまでのリアル / SRE Kaigi 2026
aeonpeople
5
330
SREのプラクティスを用いた3領域同時 マネジメントへの挑戦 〜SRE・情シス・セキュリティを統合した チーム運営術〜
coconala_engineer
1
200
3分でわかる!新機能 AWS Transform custom
sato4mi
1
270
What happened to RubyGems and what can we learn?
mikemcquaid
0
120
AI開発をスケールさせるデータ中心の仕組みづくり
kzykmyzw
0
190
新規事業における「一部だけどコア」な AI精度改善の優先順位づけ
zerebom
0
440
2026年はチャンキングを極める!
shibuiwilliam
8
1.7k
「AIでできますか?」から「Agentを作ってみました」へ ~「理論上わかる」と「やってみる」の隔たりを埋める方法
applism118
14
9k
Featured
See All Featured
My Coaching Mixtape
mlcsv
0
43
The SEO identity crisis: Don't let AI make you average
varn
0
60
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Heart Work Chapter 1 - Part 1
lfama
PRO
5
35k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
440
Practical Orchestrator
shlominoach
191
11k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
12
1k
Hiding What from Whom? A Critical Review of the History of Programming languages for Music
tomoyanonymous
2
390
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
270
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
0
130
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
66
Rails Girls Zürich Keynote
gr2m
96
14k
Transcript
作って理解する Promise 小田島 太郎 / @shimataro999 プロによる本気の攻略本『 JavaScript/TypeScript実力強化書』 - FL#115
https://forkwell.connpass.com/event/375550/
自己紹介 🪪小田島 太郎 / 𝕏 @shimataro999 🏢さくらインターネット所属 🧠AI系サービスの開発マネージャー 🃏副業で手品やってます 11/16
JSConf JP TrackC司会やってました
この発表について 対象者 非同期処理を使った プログラミング経験あり Promiseを深く理解したい Promiseの基本的な使い方や メリットを理解している
この発表について 今回お話しする内容 Promise解剖 どういう仕組み? 実際に作ってみる ⭕コンストラクター / then() / race()
❌catch() / finally() / all() / ...
Yakusokuクラスを作ります!
全体のソースコードはこちら Yakusokuのソースコード https://github.com/shimataro/yakusoku 資料も後で公開します!
事前知識
用語 内部状態 履行 / fulfilled 非同期処理が成功した 拒否 / rejected 非同期処理が失敗した
待機 / pending まだ非同期処理が終わっていない (成功も失敗もしていない) 初期状態
用語 内部状態に関するもの 解決 / resolved ≒履行(fulfilled) 厳密には違う 決定 / settled
非同期処理が履行または拒否された
状態について 内部状態 履行 / fulfilled 非同期処理が成功した 拒否 / rejected 非同期処理が失敗した
待機 / pending まだ非同期処理が終わっていない (成功も失敗もしていない) 一度決定したら それ以降は変わらない
ここまでの実装
用語 その他 Identity関数 / 恒等関数 入力値をそのまま返す関数 Thrower関数 入力値を例外としてスローする関数 Thenable then()メソッドがあるクラスやオブジェクト(
Thenable ⊃ Promise) awaitはThenableなオブジェクト全般 に対して適用できる
ヘルパー関数 Identity関数 / Thrower関数 Thenableかどうか判定 Thenableならそのまま返す そうでなければThenableにする
コンストラクター
Promiseの使い方おさらい 引数として、関数を1つ受け取る 関数は、引数として関数を2つ受け取る 非同期処理が履行された時に呼ぶ関数 非同期処理が拒否された時に呼ぶ関数
コンストラクターに追加! すでに決定されていたら何もしない executor() 内部で例外が発生した場合の処理
then() の実装
then() おさらい 関数引数を2つ受け取る 非同期処理が履行されたら1番目の関数(onFulfilled)をコール 非同期処理が拒否されたら2番目の関数(onRejected)をコール Promiseチェーン 呼び出した関数の戻り値(または関数から発生した例外) を元にしたPromiseオブジェクトを返す
Promiseチェーン promiseFunction() .then(foo , undefined) .then(bar , undefined) .then(undefined, baz)
.then(qux , undefined); fooが履行された時の流れ fooが拒否された時の流れ catch(baz)と同じ
こう! promiseFunction() .then(foo , thrower) .then(bar , thrower) .then(identity ,
baz) .then(qux , thrower); fooが履行された時の流れ fooが拒否された時の流れ
とりあえずこんな感じか・・・? 引数省略時はそれぞれ Identity関数とThrower関数 履行時と拒否時に 渡された引数をコール
とりあえずこんな感じか・・・? ❌then()コール時点で待機状態だと 何も行わずに終了してしまう ❌Promise(Yakusoku)チェーンが できない
待機状態だった時の処理 then()コール時の引数を保持しておく
待機状態だった時の処理 決定されたら保持した関数をコール
Yakusokuチェーン(ちょっとややこしい!) 待機なら新しいYakusokuオブジェクトを作成 resolve, rejectも保持対象 履行/拒否なら値をThenableにして返す 例外発生時は拒否状態のYakusokuを返す
Yakusokuチェーン(ちょっとややこしい!) 保持したresolve()やreject()をコールするよう変更 戻り値がThenableかどうか、例外が発生したかなどを考慮 reject側もほぼ同様なので省略
race()の実装
race()の仕様 複数のYakusokuオブジェクトのうち 最初に決定されたものを戻り値とする
race()の実装 最初に決定されたものが採用される!
まとめ
話したこと Promiseを実装 コンストラクター / then() / race() この先はキミの目で確かめてくれ! 3つの状態 待機
/ 履行 / 拒否 一度決定されたら変わらない
None