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

时间:2018-08-25 17:38:58

标签: javascript browser timer task-queue event-loop

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

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

console.log('start');

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

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

console.log('end');

这将输出以下内容:

> "start"
> "end"
> "promise"
> "setTimeout"

是由于现代浏览器带来的〜4ms延迟吗?

来自MDN

  

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

尽管如此,这仅适用于连续的回调嵌套。

1 个答案:

答案 0 :(得分:3)

  

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

是的。从console.log('start')console.log('end')运行的代码 就是这样的宏任务。运行完成后,将处理带有promise回调的微任务队列,直到下一个宏任务(超时)开始运行。