【问题标题】:Why is this microtask executed before macrotask in event loop?为什么这个微任务在事件循环中的宏任务之前执行?
【发布时间】:2019-01-31 20:03:46
【问题描述】:

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

如果是这样,为什么setTimeout回调在JavaScript的以下sn-p中的Promise微任务之后执行?

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() 调用被限制为 当由于以下原因触发连续呼叫时,至少每 4ms 一次 回调嵌套(其中嵌套级别至少是某个 深度),或在一定数量的连续间隔之后。

虽然这表明它只适用于连续的回调嵌套。

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-12
      • 2011-01-16
      • 1970-01-01
      • 1970-01-01
      • 2019-07-12
      • 2011-06-16
      • 1970-01-01
      相关资源
      最近更新 更多