定时器合并
2020-05-28 本文已影响0人
贪恋冬天的幸福
按照常规理解,宏任务之间理应穿插渲染,而定时器任务就是一个典型的宏任务,看一下以下的代码:
setTimeout(() => {
console.log("sto")
requestAnimationFrame(() => console.log("rAF"))
})
setTimeout(() => {
console.log("sto")
requestAnimationFrame(() => console.log("rAF"))
})
queueMicrotask(() => console.log("mic"))
queueMicrotask(() => console.log("mic"))
从直觉上来看,顺序应该是:
mic
mic
sto
rAF
sto
rAF
在浏览器中尝试,得出以下顺序:
mic
mic
sto
sto
rAF
rAF
浏览器实际上合并了两个定时器任务,也就是说并不是每一个宏任务之后都紧跟着一次渲染。但是一定会伴随着微任务的执行,浏览器是否渲染的决定因素有很多。