原理是什么:
vue用异步队列的方式来控制DOM更新和nextTick回调先后执行
microtask因为其高优先级特性,能确保队列中的微任务在一次事件循环前被执行完毕
因为兼容性问题,vue不得不做了microtask向macrotask的降级方案
是如何监听到函数完成的:
首先必须知道能实现监听DOM的api是MutationObserver
vue并不是使用MutationObserver监听节点dom的更新,而是通过它打包队列控制的目的(macrotask总要等到microtask都执行完后才能执行,microtask有着更高的优先级),
vue进行DOM更新内部也是调用nextTick来做异步队列控制。而当我们自己调用nextTick的时候,它就在更新DOM的那个microtask后追加了我们自己的回调函数,从而确保我们的代码在DOM更新后执行,同时也避免了setTimeout可能存在的多次执行问题。
是如何做的兼容:
microtask的降级方案依次是:promise,macrotask
(首选promise,如果不支持的话,)
macrotask降级的方案依次是:setImmediate、MessageChannel、setTimeout.