Upgrade to PRO for Only $50/Year—Limited-Time Offer! 🔥
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
作って理解するPromise / Let's try implementing Promise
Search
shimataro
November 28, 2025
Technology
0
8
作って理解する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
690
An introduction to Node.js
shimataro
0
290
KFDのススメ / About KFD
shimataro
3
820
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
790
BigInt あれこれ / overview about BigInt
shimataro
0
910
dynamic import あれこれ / dynamic import - overview and pitfalls
shimataro
1
830
Other Decks in Technology
See All in Technology
一億総業務改善を支える社内AIエージェント基盤の要諦
yukukotani
6
2.1k
AI時代のインシデント対応 〜時代を切り抜ける、組織アーキテクチャ〜
jacopen
4
170
Sansan Engineering Unit 紹介資料
sansan33
PRO
1
3.2k
命名から始めるSpec Driven
kuruwic
3
680
SRE視点で振り返るメルカリのアーキテクチャ変遷と普遍的な考え
foostan
2
3k
日経電子版の BCP への取り組みについて/mediajaws1121
nikkei_engineer_recruiting
0
110
【ASW21-02】STAMP/CAST分析における生成AIの支援 ~羽田空港航空機衝突事故を題材として (Support of Generative AI in STAMP/CAST Analysis - A Case Study Based on the Haneda Airport Aircraft Accident -)
hianraku9498
1
360
インフラ室事例集
mixi_engineers
PRO
2
110
事業部のプロジェクト進行と開発チームの改善の “時間軸" のすり合わせ
konifar
6
1.2k
Kill the Vibe?Architecture in the age of AI
stoth
1
120
学術的根拠から読み解くNotebookLMの音声活用法
shukob
0
510
Data Hubグループ 紹介資料
sansan33
PRO
0
2.3k
Featured
See All Featured
Bootstrapping a Software Product
garrettdimon
PRO
307
110k
Producing Creativity
orderedlist
PRO
348
40k
Unsuck your backbone
ammeep
671
58k
StorybookのUI Testing Handbookを読んだ
zakiyama
31
6.4k
Measuring & Analyzing Core Web Vitals
bluesmoon
9
680
Documentation Writing (for coders)
carmenintech
76
5.1k
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
1.8k
Raft: Consensus for Rubyists
vanstee
140
7.2k
Making the Leap to Tech Lead
cromwellryan
135
9.6k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
130k
Being A Developer After 40
akosma
91
590k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.3k
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