Promise を扱っている時に microQueue が積まれるタイミング

Published: 2022/10/10


tc39 の仕様を読んで、どのタイミングで処理が microTaskQueue に積まれるかを体系的に理解したくなったので、それについてのメモ。

上記の仕様を読む限り、 queueMicrotask のこの仕様上の用語である HostEnqueuePromiseJob が表れる箇所は、列挙して以下の通り。

このうち、 TriggerPromiseReactions の対象 PromiseReaction Record はやはり PerformPromiseThen によって作成されているので、究極的には以下の2パターンしかない。

  1. promise.then
  2. thenableresolve する。

また、 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 する
  • await 文: 内部で promise.then に変換されるので 1 tick
  • (async 関数において) return promise: resolve(promise) することになるので、 2 tick

参考記事


Tags: javascript

関連記事