为什么这个微任务在事件循环中的宏任务之前执行?

Ada*_*son 1 javascript browser timer event-loop task-queue

我的理解是每个宏任务之后处理完整的微任务任务队列。

如果是这种情况,为什么在以下代码片段中setTimeoutPromise微任务之后执行回调JavaScript

console.log('start');

setTimeout(() => {
  console.log("setTimeout");
});

Promise.resolve().then(function() {
  console.log('promise');
});

console.log('end');
Run Code Online (Sandbox Code Playgroud)

这将输出以下内容:

> "start"
> "end"
> "promise"
> "setTimeout"
Run Code Online (Sandbox Code Playgroud)

是因为4ms现代浏览器强加了 ~延迟吗?

来自MDN

在现代浏览器中,当由于回调嵌套(其中嵌套级别至少为一定深度)或在一定数量的连续间隔后触发连续调用时,setTimeout()/setInterval()调用被限制为至少每 4 毫秒一次。

尽管这表明它仅适用于连续回调嵌套。

Ber*_*rgi 5

我的理解是在每个宏任务之后处理完整的微任务任务队列。

是的。你运行的代码,从console.log('start')console.log('end')就是这样一个宏任务。在它运行完成后,带有承诺回调的微任务队列被处理,只有在此之后下一个宏任务(超时)才能运行。