当前位置: 首页 > news >正文

Vue JS执行机制和nextTick

参考文章:
JS执行机制详解
这一次,彻底弄懂 JavaScript 执行机制
在这里插入图片描述

  • 宏任务中的同步任务:script、new promise 立即执行
  • 宏任务(macro-task):setTimeOut、setInterval
  • 微任务(mincro-task):promise.then、process.nextTick(node)

setTimeOut:设置的时间意思是在多久后将此宏任务放到队列中,而不是在队列中等待时间到了才执行

await:微任务,在await之后执行的代码,必须等到await执行完毕后才可以执行,

执行流程

  1. 自上而下分析script中代码
  2. 同步任务依次加入主线程准备执行
  3. 宏任务放到宏任务队列中,微任务放到微任务队列
  4. 主线程中的代码执行,执行中出现的宏任务和微任务继续添加到队列中
  5. 微任务队列中任务放到主线程执行
  6. 微任务执行完毕(此时完成一个循环,开启下一个循环)
  7. 再把宏任务队列中任务放到主线程中执行,执行中出现的宏任务和微任务继续添加到队列中,重复步骤:4–7

示例代码

async function Prom() {console.log("1");await Promise.resolve();console.log("2");// 写在await Promise后面相当于then,加入微任务
}setTimeout(() => {console.log("3");Promise.resolve().then(() => {console.log(`4`);})
},0);Promise.resolve().then(() => {console.log("5");
})Prom();
console.log(0);

执行顺序

1. 自上而下分析script代码,进入主线程执行的是:
Prom();
console.log(0);
  1. 进入宏任务队列的代码:
setTimeout(() => {console.log("3");Promise.resolve().then(() => {console.log(`4`);})
},0);// 设置等待时间为0,立即会被放到宏任务队列中
  1. 进入微任务队列的代码:
Promise.resolve().then(() => {console.log("5");
})
  1. script中的代码都进入了相对应的队列,现在主线程开始执行
  2. 执行Prom();这个方法调用的Prom方法,代码是:
async function Prom() {console.log("1");await Promise.resolve();console.log("2");
}
  1. 执行console.log("Y");—控制器输出:1
  2. 执行下一句: await Promise.resolve();发现这是一个微任务,加入到微任务的队列中,现在微任务的队列中有两个任务:
// 微任务队列中的任务,1
Promise.resolve().then(() => {console.log("5");
})// 微任务队列中的任务,2await Promise.resolve();console.log("2");// 写在await Promise后面相当于then,加入微任务
  1. 主线程中还剩一个任务:console.log(0);,执行,控制器输出:1 0

  2. 此时主线程中的任务已经全部完成,接下来执行微任务队列

  3. 微任务中的任务放到主线程执行,微任务1:Promise.resolve().then(() => { console.log("5"); })控制器输出:1 0 5

  4. 微任务2:await Promise.resolve();console.log("2");控制器输出:1 0 5 2

  5. 此时微任务队列也被清空

  6. 此时一个循环周期的任务完成,准备执行下一个循环

  7. 宏任务队列的代码放入主线程执行

  8. 宏任务执行setTimeout()方法,console.log("3");控制器输出:1 0 5 2 3

  9. seiTimeout()方法中执行到 Promise.resolve().then(() => { console.log(4); })将此任务放入到微任务队列中,继续执行宏任务队列,宏任务队列此时已经没有任务。

  10. 执行微任务代码 Promise.resolve().then(() => { console.log(4); }),控制器输出:1 0 5 2 3 4

  11. 执行完毕,共用了两个执行周期

nextTick

  • 在组件中数据是同步的,Dom是异步的,当数据发生变化,Dom没有发生相应的变化,需要使用nextTick

有两种方法更新Dom

第一种

nextTick(()=>{// Todo:改变Dom的操作
})

第二种

  • 使用await,await后面的代码就是异步的微任务
async()=>{
}
await nexttick() 
// Todo:改变Dom的操作

nextTick源代码

export function nextTick<T = void, R = void>(this: T,fn?: (this: T) => R,
): Promise<Awaited<R>> {const p = currentFlushPromise || resolvedPromisereturn fn ? p.then(this ? fn.bind(this) : fn) : p
}
  • 为什么加上nextTick就可以刷新Dom?
    源码分析可知,使用nextTick后,代码会放入到Promise.resolve().then(()=>{// 代码放在这里执行}),添加到微任务队列中执行

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Python算法工程师面试整理-微积分
  • SAP商业地产管理(RE-FX)
  • 微信小程序如何存储值
  • 集成mybatis-plus框架
  • 3.3、matlab彩色图和灰度图的二值化算法汇总
  • 如何在不格式化的情况下解锁 Android 智能手机密码
  • ue5远程渲染和本地渲染的区别,及云渲染的联系
  • 【MySQL 11】索引 (带思维导图)
  • 8.4 数据库基础技术-SQL
  • http基础原理及应用
  • 【SQL】窗口函数sum() over ( partition by xx order by xx)
  • 基于game-based算法的动态频谱访问matlab仿真
  • 重构多重children数据 减少数据
  • 服务启动方法LINUX
  • JS数据类型——【set】精讲
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【Amaple教程】5. 插件
  • 002-读书笔记-JavaScript高级程序设计 在HTML中使用JavaScript
  • CentOS 7 修改主机名
  • es6要点
  • HTML中设置input等文本框为不可操作
  • java正则表式的使用
  • Vultr 教程目录
  • 阿里研究院入选中国企业智库系统影响力榜
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 前端攻城师
  • 设计模式(12)迭代器模式(讲解+应用)
  • 深入浏览器事件循环的本质
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 突破自己的技术思维
  • 小程序开发中的那些坑
  • 异常机制详解
  • ​2021半年盘点,不想你错过的重磅新书
  • ​香农与信息论三大定律
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • ### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTr
  • #控制台大学课堂点名问题_课堂随机点名
  • %@ page import=%的用法
  • (9)YOLO-Pose:使用对象关键点相似性损失增强多人姿态估计的增强版YOLO
  • (ros//EnvironmentVariables)ros环境变量
  • (笔记)M1使用hombrew安装qemu
  • (二)PySpark3:SparkSQL编程
  • (二)换源+apt-get基础配置+搜狗拼音
  • (二十四)Flask之flask-session组件
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (十八)三元表达式和列表解析
  • (十七)Flink 容错机制
  • (原創) 系統分析和系統設計有什麼差別? (OO)
  • .NET/C# 如何获取当前进程的 CPU 和内存占用?如何获取全局 CPU 和内存占用?
  • .net6 core Worker Service项目,使用Exchange Web Services (EWS) 分页获取电子邮件收件箱列表,邮件信息字段
  • .NET的微型Web框架 Nancy
  • .NET开源项目介绍及资源推荐:数据持久层
  • .net通用权限框架B/S (三)--MODEL层(2)
  • @Import注解详解
  • @property括号内属性讲解