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
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
shimataro
November 28, 2025
Technology
0
31
作って理解する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
720
An introduction to Node.js
shimataro
0
310
KFDのススメ / About KFD
shimataro
3
840
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
830
BigInt あれこれ / overview about BigInt
shimataro
0
950
dynamic import あれこれ / dynamic import - overview and pitfalls
shimataro
1
850
Other Decks in Technology
See All in Technology
AI Coding Agentの地殻変動 ~ ai-coding.info の定点観測 ~
kotauchisunsun
1
490
サンタコンペ2025完全攻略 ~お前らの焼きなましは遅すぎる~
terryu16
1
540
Snowflake Night #2 LT
taromatsui_cccmkhd
0
270
ソフトウェアアーキテクトのための意思決定術: Create Decision Readiness—The Real Skill Behind Architectural Decision
snoozer05
PRO
27
7.6k
「使いにくい」も「運用疲れ」も卒業する UIデザイナーとエンジニアが創る持続可能な内製開発
nrinetcom
PRO
1
760
Exadata Fleet Update
oracle4engineer
PRO
0
1.3k
AIに視覚を与えモバイルアプリケーション開発をより円滑に行う
lycorptech_jp
PRO
1
570
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
3k
Agentic Codingの実践とチームで導入するための工夫
lycorptech_jp
PRO
0
200
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.4k
opsmethod第1回_アラート調査の自動化にむけて
yamatook
0
330
WBCの解説は生成AIにやらせよう - 生成AIで野球解説者AI Agentを実現する / Baseball Commentator AI Agent for Gemini
shinyorke
PRO
0
300
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
9.7k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
3.7k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.1k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.1k
Designing for humans not robots
tammielis
254
26k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.6k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.3k
Un-Boring Meetings
codingconduct
0
220
Speed Design
sergeychernyshev
33
1.6k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.4k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
96
The Curious Case for Waylosing
cassininazir
0
260
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