Javascript 承诺 setTimeout 执行

Javascript promises setTimeout execution

我一直在玩 Promises,但我无法理解以下代码所发生的事情:

const promise = new Promise((resolve, reject) => {
  console.log('Promise started')
  resolve('Success')
})

setTimeout(() => {
  console.log('Log inside first setTimeout')
}, 0)

promise.then(res => {
  console.log('Promise log after fulfilled ❌')
})

setTimeout(() => {
  console.log('Log inside second setTimeout')
}, 0)

输出为:

Promise started 
Promise log after fulfilled ❌ 
Log inside first setTimeout 
Log inside second setTimeout 

为什么不是下面的输出?

Promise started 
Log inside first setTimeout 
Log inside second setTimeout 
Promise log after fulfilled ❌ 

setTimeout(fn, 0)fn调用和resolve()fn调用哪个优先?

是否依赖浏览器实现细节?

setTimeout 是一个宏任务——这些都是在微任务之后解决的,其中包括 Promises。 setTimeout 是非阻塞的,因此代码在第一个 setTimeout 执行之前执行(包括 .then),然后是第二个 setTimeout 最后执行。

Promise 具有更高的优先级,因为它们在微任务队列中排队。首先处理微任务队列中的任务。然后处理其他计划任务,在本例中为setTimeout