Promise を扱っている時に microQueue が積まれるタイミング
Published: 2022/10/10
tc39 の仕様を読んで、どのタイミングで処理が microTaskQueue に積まれるかを体系的に理解したくなったので、それについてのメモ。
上記の仕様を読む限り、 queueMicrotask のこの仕様上の用語である HostEnqueuePromiseJob が表れる箇所は、列挙して以下の通り。
このうち、 TriggerPromiseReactions の対象 PromiseReaction Record はやはり PerformPromiseThen によって作成されているので、究極的には以下の2パターンしかない。
promise.then
-
thenable
を
resolve
する。
また、 2 の thenable を resolve
する場合でその引数に promise を渡す場合、呼ばれた promise の then
自体がさらに queueMicrotask することになるので、結果 2 つ分の microTask を実行することになる。
これをベースに列挙して、
- promise.catch: promise.then の syntax sugar で 1 tick
- promise.finally: then を内部で 2回使っているので 2 tick
- Promise.all: 各要素 promise に 1 tick 追加
- 配列系は大体各 promise を1回
.then
する
- 配列系は大体各 promise を1回
- await 文: 内部で promise.then に変換されるので 1 tick
- (async 関数において) return promise: resolve(promise) することになるので、 2 tick
参考記事
徹底解説! return promiseとreturn await promiseの違い
zenn.dev

Tags: javascript
関連記事
Promise 同時実行制御のための async-pool
2023/9/30
Node.js でコマンドの実行結果を1行ずつ取得する方法
2022/10/9
(async) 非同期関数と非同期ジェネレータまとめ
2022/6/30