延迟执行--Event loop--Vue(nextTick)

在编写js代码中大家基本都用到过setTimeOut这个延迟函数,通常是等待DOM处理完成后触发某些事件。用法setTimeout(()=>{//延迟处理的事件},0)
而这个setTimeout其实是涉及到异步编程 event loop知识。
这里参考Tasks, microtasks, queues and schedules;
js是单线程的,里面可执行的代码分为任务(Tasks)和微任务(Microtasks)。上链接中的代码:

console.log('script start');

setTimeout(function() {
  console.log('setTimeout');
}, 0);

Promise.resolve().then(function() {
  console.log('promise1');
}).then(function() {
  console.log('promise2');
});

console.log('script end');

例子中的Promise回调是微任务,其他的都称为任务,有的还把setTimeout回调叫Macrotask。setTimeout只是把任务排到了所有任务的最后面。按代码执行顺序,执行完成后,会优先执行微任务,所以先执行Promise回调(包括后面的then),最后才执行setTimeout。最终输出结果如下:

script start
script end
promise1
promise2
setTimeout

得出微任务比setTimeout要快一些,前段时间看vue的nextTick中提到首选使用Promise.then来解决就是用的微任务,次选是MutationObserver。这个东西又是什么?
MDN上说MO 给开发者提供了一种能在某个范围内的DOM数发生变化时作出适当反应的能力。其实就是一个监听DOM对象的观察者。
使用方法是var observer=new MutationObserver(callback)
实例有3个方法
observer.observer(targer,options);//DOM元素,配置参数监听一个DOM元素
observer.disconnect();解除监听
observer.takeRecords();清空observer操作记录并返回操作记录
options项参数有(MDN复制)

属性 说明
childList 设置为true如果要观察目标节点的子元素(包括文本节点)的添加和删除。
attributes 设置为true是否要观察到目标属性的突变。
characterData 设定为true要观察目标数据的突变。
subtree 设定为true要观察目标和目标的后代的突变。
attributeOldValue 设置为true,如果attributes设置为true需要记录突变之前和目标的属性值。
characterDataOldValue 设置为true如果characterData设置为true目标数据,然后才需要记录突变。
attributeFilter 值为一个数组,表示需要观察的特定属性(比如['class', 'str'])。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 你不知道JS:异步 第三章:Promises 在第二章,我们指出了采用回调来表达异步和管理并发时的两种主要不足:缺...
    purple_force阅读 2,122评论 0 4
  • 特别说明,为便于查阅,文章转自https://github.com/getify/You-Dont-Know-JS...
    杀破狼real阅读 911评论 0 2
  • 眼睛都涩涩的呢,差点都不想码字了 一 又开始做一枚早起早睡girl了,早到什么时候呢,三点多起来,四点开始做功课,...
    淼淼故事屋阅读 136评论 0 0
  • 今天我在晾衣服,那衣服本来就是前两天洗了,今天收的时候掉下来了,重洗了再晾上去,又掉下来,本来赶时间的我忍不住说了...
    雨后彩虹_440f阅读 160评论 0 0
  • 一个不够优秀的人,他的工资是由老板决定的。很多人因为工资低,而频繁的跳槽,跳到最后,自己也不知道能干什么。 要想解...
    斑点鱼阅读 210评论 0 0