VUE的异步队列

VUE中有一个方法 nextTick,它的作用是将函数推到下一个事件循环再执行。我们在开发中经常用到它,比如某些操作要等页面渲染更新后再执行,这时候就用this.$nextTick()。同时vue内部也常用到它,比如监听数据变化时不会每次都触发更新,而是将更新任务放在一个异步队列中,最终只触发一次更新。
我们来模拟nextTick的实现原理,将其写成一个简化版本:

let callbacks = [];
let pending = false;
function nextTick(cb) {
    callbacks.push(cb);
    if (!pending) {
        pending = true;
        timeFunc();
    }
}
function timeFunc() {
    setTimeout(() => {
        flushQueue();
    }, 0)
}
function flushQueue() {
    const copies = callbacks.slice(0);
    // 之所以拷贝数组,是考虑某些情况下会有嵌套使用nextTick的场景
    // 若不拷贝,则嵌套的nextTick任务会被推入任务队列,在本次事件循环执行
    callbacks.length = 0;
    pending = false;
    copies.forEach(cb => cb());
}

console.log(1);
nextTick(() => {
    console.log(2);
    nextTick(() => console.log(3))
});
nextTick(() => console.log(4));
console.log(5);

// 打印顺序应该是 1 5 2 4 3

在node环境下直接运行,查看结果,和我们预期的一致:


image.png
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本篇文章主要是对Vue中的DOM异步更新策略和nextTick机制的解析,需要读者有一定的Vue使用经验并且熟悉掌...
    wdapp阅读 674评论 0 1
  • 33、JS中的本地存储 把一些信息存储在当前浏览器指定域下的某一个地方(存储到物理硬盘中)1、不能跨浏览器传输:在...
    萌妹撒阅读 2,104评论 0 2
  • Vue中的nextTick涉及到Vue中DOM的异步更新,感觉很有意思,特意了解了一下。其中关于nextTick的...
    world_7735阅读 1,121评论 0 21
  • Vue中的nextTick涉及到Vue中DOM的异步更新,感觉很有意思,特意了解了一下。其中关于nextTick的...
    追寻1989阅读 373评论 0 0
  • vue 2.X 深入响应式原理的异步更新队列中说明如下: 只要侦听到数据变化,Vue 将开启一个队列,并缓冲在同一...
    指尖跳动阅读 9,489评论 1 11