Lock in $30 Savings on PRO—Offer Ends Soon! ⏳
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
15
作って理解する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
700
An introduction to Node.js
shimataro
0
300
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
920
dynamic import あれこれ / dynamic import - overview and pitfalls
shimataro
1
830
Other Decks in Technology
See All in Technology
新 Security HubがついにGA!仕組みや料金を深堀り #AWSreInvent #regrowth / AWS Security Hub Advanced GA
masahirokawahara
1
2.2k
Database イノベーショントークを振り返る/reinvent-2025-database-innovation-talk-recap
emiki
0
230
re:Invent2025 コンテナ系アップデート振り返り(+CloudWatchログのアップデート紹介)
masukawa
0
390
AI 駆動開発勉強会 フロントエンド支部 #1 w/あずもば
1ftseabass
PRO
0
400
生成AI活用の型ハンズオン〜顧客課題起点で設計する7つのステップ
yushin_n
0
240
ExpoのインダストリーブースでみたAWSが見せる製造業の未来
hamadakoji
0
150
NIKKEI Tech Talk #41: セキュア・バイ・デザインからクラウド管理を考える
sekido
PRO
0
140
RAG/Agent開発のアップデートまとめ
taka0709
0
190
MariaDB Connector/C のcaching_sha2_passwordプラグインの仕様について
boro1234
0
350
AWS CLIの新しい認証情報設定方法aws loginコマンドの実態
wkm2
6
750
20251218_AIを活用した開発生産性向上の全社的な取り組みの進め方について / How to proceed with company-wide initiatives to improve development productivity using AI
yayoi_dd
0
120
年間40件以上の登壇を続けて見えた「本当の発信力」/ 20251213 Masaki Okuda
shift_evolve
PRO
1
140
Featured
See All Featured
Rails Girls Zürich Keynote
gr2m
95
14k
Side Projects
sachag
455
43k
Scaling GitHub
holman
464
140k
Navigating Team Friction
lara
191
16k
Building Adaptive Systems
keathley
44
2.9k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
1.8k
VelocityConf: Rendering Performance Case Studies
addyosmani
333
24k
Documentation Writing (for coders)
carmenintech
77
5.2k
Mobile First: as difficult as doing things right
swwweet
225
10k
What's in a price? How to price your products and services
michaelherold
246
13k
How to train your dragon (web standard)
notwaldorf
97
6.4k
A Modern Web Designer's Workflow
chriscoyier
698
190k
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