同じ同期コードのあとに Promise.then と setTimeout(0) を登録したとき、先に走るのはどちらか?
選択肢を選ぶと解説が表示されます
正解: A. Promise.then のコールバック
ブラウザのイベントループでは、タスク(task / いわゆる macrotask)のあとにマイクロタスクを処理する。Promise.then / catch / finally のコールバックはマイクロタスク、setTimeout はタスクとしてキューに入る。
そのため、同じ同期コードの実行中に両方を登録しても、同期部分が終わったあと先にマイクロタスクが空になるまで処理され、その後に setTimeout(0) が走る。setTimeout を先に書いていても、この順序は変わらない。
意図的にマイクロタスクへ載せたい場合は queueMicrotask() もある。
参考文献
- In depth: Microtasks and the JavaScript runtime environment - MDN — タスクとマイクロタスクの処理順
- Using microtasks in JavaScript with queueMicrotask() - MDN — マイクロタスクキューの位置づけ