我的理解是,在每个宏任务之后 处理完整的微任务任务队列。
如果是这种情况,为什么在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毫秒一次 回调嵌套(嵌套级别至少为 深度),或在一定数量的连续间隔之后。
尽管如此,这仅适用于连续的回调嵌套。
答案 0 :(得分:3)
我的理解是,完整的微任务任务队列是在每个宏任务之后处理的。
是的。从console.log('start')
到console.log('end')
运行的代码 就是这样的宏任务。运行完成后,将处理带有promise回调的微任务队列,直到下一个宏任务(超时)开始运行。