看了看nextTick的源码,内部好像是优先使用Promise实现
if (typeof Promise !== 'undefined' && isNative(Promise)) {
const p = Promise.resolve()
timerFunc = () => {
p.then(flushCallbacks)
if (isIOS) setTimeout(noop)
}
} else if ....
但Promise的回调作为微任务,应该是在本次事件循环结束前执行的,也就是在DOM更新前执行。
但实际的情况是,nextTick的回调确实会在DOM更新后执行,是我哪里的理解错误的呢~
html规范
执行 UI render 操作:
判断 document 在此时间点渲染是否会『获益』。浏览器只需保证 60Hz 的刷新率即可(在机器负荷重时还会降低刷新率),若 eventloop 频率过高,即使渲染了浏览器也无法及时展示。不是每轮 eventloop 都会执行 UI Render。
所以准确的来说UI rendering是事件循环里面的一个和微任务平行的操作步骤,根据相关机制来执行的,而不是单纯把它当作一个宏任务。