When run the below code snippet, it outputs 2,1
. Since Promise is a micro-task and everything inside a promise should run before a macro-task (setTimeout), I expect that the output will be 1,2
. So even if there is a macro-task inside a micro-task, I thought the output will be 1,2
.
But it outputs 2,1
.
What’s the catch here? Why does it outputs 2,1
instead 1,2
?
Promise.resolve().then(() => { setTimeout(() =>{ console.log("1") }, 0) }) setTimeout(() => { console.log("2") }, 0)
Advertisement
Answer
The promise is a micro task and will get executed before timeout1
, but timeout1
is already scheduled as a macro task.
When the promise resolves, timeout2
will get scheduled, but the macrotask Q already has timeout1
and as such this is already scheduled and will get executed first.