正解は A → C → B です。Promise.resolve() はすでに解決済みの Promise を返しますが、.then() に渡したコールバックは「即座に」実行されるわけではなく、現在実行中の同期コードがすべて終わってから実行されます。そのため 'A' と 'C' が先に同期的に出力され、その後で 'B' が出力されます。「B → A → C」や「ランダム」になることは仕様上ありえません。マイクロタスクキューという仕組みJavaScript は基本的にシングルスレッドで動き、実行待ちのタスクは「キュー」に積まれて順番に処理されます。このキューには大きく2種類あり、Promise の .then コールバックは マイクロタスクキュー、setTimeout などは マクロタスクキューに積まれます。現在のコード(同期処理)が終わると、エンジンはまずマイクロタスクキューを空になるまで処理し、その後で次のマクロタスクに進みます。setTimeout(0) との違いを比べてみるconsole.log('A'); setTimeout(() => console.log('B'), 0); Promise.resolve().then(() => console.log('C')); console.log('D');このコードは A → D → C → B の順で出力されます。setTimeout(fn, 0) は「すぐ実行」に見えますが、マクロタスクなのでマイクロタスクである Promise より後回しになるのです。「Promise の方が setTimeout より優先される」と覚えておくと、非同期処理の挙動がぐっと読めるようになります。実務での使いどころPromise.resolve().then(...) は「現在の処理が終わった直後に何かしたい」ときの常套手段です。たとえば DOM 更新後に処理を走らせたい、再帰的な状態更新を一度落ち着かせてからまとめたい、といった場面で使われます。queueMicrotask() という専用 API も同じ役割を果たすので、より意図が明確になります。