博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Vue nextTixk与任务
阅读量:5843 次
发布时间:2019-06-18

本文共 865 字,大约阅读时间需要 2 分钟。

js的macrotask和microtask

  • js每次事件循环只从macrotask中读取一个并任务执行,同一个事件循环会把microtask中的任务执行完毕并且先于macrotask

为什么要将数据更新的处理函数放在microtask队列中

  • 两个macrotask中可能穿插着ui重渲染,所以在microtask中在ui重渲染之前把所有的数据更新,一次渲染就能得到最新的DOM结构,减少开销;所以优先把更新数据的操作放在microtask队列中,批处理更新

vue中的nextTick的实现

  • vue中的nextTick根据浏览器的特性封装,优先级如下

    • vue@2.5+ Promise > setImmediate > MessageChannel > setTimeout。
    • vue@<2.5 Promise > MutationObserver > setTimeout

      • Promise

        • 以上函数只有Promise是将回调放进microTak队列中,所以是最优方案,只有在Promise不存在的情况下才会走其他方法。
      • 将setTimeout放到优先级的最后的原因:

        • setimeout中的回调并不是放在microtask而是macrotask中,对于重渲染是有开销的;
        • 在回调之前要不断做超时检查, 用setTimeout最快也是4ms发以后调用回调
        • 虽然setTimeout不是最优方案但是可作为兼容性最好的方案
      • MessageChannel 和 MutationObserver

        • 由于兼容性问题,vue2.5开始抛弃了MutationObserver
        • MessageChannel拥有port1,port2两个属性,让其中一个port监听onMessage,另一个port发送消息即可,不需要像setTimeout做超时检测,它作为非ie浏览器兼容方案。
        • onMessage回调会被注册为macroTask。
      • setImmediate也是将回调函数放进marcoTak中,优点是不需要做超时检测,目前只有ie浏览器实现。

转载地址:http://ipqcx.baihongyu.com/

你可能感兴趣的文章
升级win10后无法使用桥接网络解决方法
查看>>
如何进行跨网段的远程唤醒
查看>>
数据挖掘-同比与环比
查看>>
nginx+php详解
查看>>
我的友情链接
查看>>
RedHat6 管理应用服务【11】
查看>>
stm32F10x复习-1
查看>>
20135226黄坤信息安全系统设计基础期末总结
查看>>
轻松快捷创建VSFTP虚拟用户
查看>>
[转]Javascript原型继承
查看>>
[转] vue异步处理错误
查看>>
CSS 3D动画概述菜鸟级解读之一
查看>>
分布式系列文章 —— 从 ACID 到 CAP / BASE
查看>>
方法签名与方法重载
查看>>
matlab进行地图仪的绘制
查看>>
Strawberry Perl CPAN Install Module 安装 Module 方法
查看>>
kindeditor.net应用
查看>>
函数preg_replace()与str_replace()
查看>>
Linux c括号作用域【原创笔记】
查看>>
用IPFS和以太坊存储数据
查看>>