Open huoxiangdong opened 6 years ago
事件触发线程
的执行栈
任务队列
,只要异步任务有了运行结果,就在任务队列之中放置一个事件。可执行栈中,开始执行
执行栈
,setTimeout
或setInterval
时,它需要定时器线程计时,计时完成后就会将特定的事件推入事件队列中Mutation Observer
会得到通知
var counter = 1
var observer = new MutationObserver(nextTickHandler)
var textNode = document.createTextNode(String(counter))
observer.observe(textNode, { characterData: true }) timerFunc = () => { counter = (counter + 1) % 2 textNode.data = String(counter) }
不过,现在的Vue(2.5+)的nextTick实现移除了MutationObserver的方式(据说是兼容性原因),
取而代之的是使用MessageChannel
(当然,默认情况仍然是Promise,不支持才兼容的)。
MessageChannel属于宏任务,优先级是:setImmediate->MessageChannel->setTimeout,
所以Vue(2.5+)内部的nextTick与2.4及之前的实现是不一样的,需要注意下。
事件队列
task 宏任务队列
:每次执行栈执行的代码就是一个宏任务(包括每次从事件队列中获取一个事件回调并放到执行栈中执行)setTimeout
、setInterval
、setImmediate
、I/O
、UI交互事件
task->渲染->task->...
microtask 微任务队列
:可以理解是在当前 task 执行结束后立即执行的任务Promise
、process.nextTick
、MutaionObserver