JS 的 事件循环 和 任务队列 其实是理解 nextTick 概念的关键
这个其实有很多优质的文章做了详细介绍,我就简单过过了
以下内容适用于浏览器端 JS,NodeJS 的事件循环机制并不相同
通常認为是 task
的任务源:
Vue 中数据的变化到 DOM 的更新渲染是一个异步过程
此方法便用于在 DOM 更新循环结束之后执行延迟回调。
去除注释其实也只有不到一百来行,整体还是很容易理解的
这里划成 3 个部分介绍。
介绍 引入的模块 和 定义的变量
// noop 空函数,可用作函数占位符
// Vue 内部的错误处理函数
// 以数组形式存储执行的函数
// 遍历函数数组执行每一项函数
接下来是核心的 异步延迟函數这里不同的 Vue 版本采用的策略其实并不相同。
2.6 版本优先使用 microtask 作为异步延迟包装器
2.5 版本则是 macrotask 结合 microtask。然而在重绘之前状态改变时会有小問题(如 )。此外在事件处理程序中使用 macrotask 会导致一些无法规避的奇怪行为(如,,)。
所以 2.6 版本现在又改用 microtask 了为什么是又呢。洇为 2.4 版本及之前也是用的 microtask。。
microtask 在某些情况下也是会有问题的因为 microtask 优先级比较高,事件会在顺序事件(如 有变通方法)之间甚至在同┅事件的冒泡过程中触发()。
// 核心的异步延迟函数用于异步延迟调用 flushCallbacks 函数
// 因此,添加一个空计时器“强制”执行 microtask 队列
nextTick 函数。接受两個参数:
cb 回调函数:是要延迟执行的函数;
整体看过来感觉还是比较好理解的吧~ 2.6 版本相比之前简化了一点。
事件处理程序中触发的nextTick 会優先使用 macrotask。感兴趣可自行去末尾的参考地址进行查阅