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

js中的同步任务、异步任务、宏任务、微任务

js中的同步任务、异步任务、宏任务、微任务

大部分人都知道其实js是单线程的,一段js代码都是从上往下执行的。后面js搞了异步任务,又搞了宏任务,微任务来模仿多线程。
很多博客都是用这张图解释的
首先js执行代码时,看当前要执行的代码是同步任务还是异步任务,当是同步任务js就会直接执行,当遇到是异步任务时,会将其放到异步任务队列中,当同步任务执行完毕,才会去执行异步任务。

在宏任务与微任务中,像我们比较常见的setTimeout和setInterval这些都是常见的宏任务,遇到这些又会将其放入宏任务队列,但是也会遇到像1. Promise2.process.nextTick(Node.js) 3. Object.observe(已废弃;Proxy 对象替代)4. MutaionObserver这些又属于微任务,当遇到这些又会将其放到微任务队列。
当同步任务执行完毕后,就会去执行微任务看有没有微任务需要执行的,当有微任务时把微任务执行完毕然后再到宏任务中去继续执行,如果宏任务中还有微任务也会将其放到微任务队列中,等宏任务执行完就会去执行微任务,然后再去宏任务,就形成了循环。
可以用下图描述
在这里插入图片描述
在执行栈中执行一个宏任务。
执行过程中遇到微任务,将微任务添加到微任务队列中。
当前宏任务执行完毕,立即执行微任务队列中的任务。
当前微任务队列中的任务执行完毕,检查渲染,GUI线程接管渲染。
渲染完毕后,js线程接管,开启下一次事件循环,执行下一次宏任务(事件队列中取)。

上面是自己的一些理解和看其他大佬的,我觉得用例子来说明宏任务微任务是最好理解的。

console.log('1');// 此时同步任务最先输出

setTimeout(function() {//异步任务会将其放入任务队列中
    console.log('2');
    process.nextTick(function() {
        console.log('3');
    })
    new Promise(function(resolve) {
        console.log('4');
        resolve();
    }).then(function() {
        console.log('5')
    })
})
process.nextTick(function() {//微任务将其放入微任务队列中
    console.log('6');
})
new Promise(function(resolve) {
    console.log('7');//这里是promise的初始化相当于同步任务会立即输出的
    resolve();
}).then(function() {//这里是回调是微任务,会放入微任务队列中
    console.log('8')
})

setTimeout(function() {//异步任务放入任务队列中
    console.log('9');
    process.nextTick(function() {
        console.log('10');
    })
    new Promise(function(resolve) {
        console.log('11');
        resolve();
    }).then(function() {
        console.log('12')
    })
})
第一轮同步输出 17
第一轮微任务输出 68
然后再是第一个异步任务,里面又有微任务又有宏任务 又输出2435
最后一个异步任务 就输出 9111012

可能我自己的理解表达的不是很清楚,可以看其他大佬的如这位

相关文章:

  • 给大家推荐一套 git 工作流
  • JWT解密和python反序列化之[CISCN2019 华北赛区 Day1 Web2]ikun
  • 《用Go语言自制解释器》之第3章 求值
  • C++ - 8月31日 - 约瑟夫环问题
  • C++ 模板泛型编程
  • Retrofit原理解析(二)
  • 数据结构与算法 -- 子序列问题
  • python中namedtuple函数用法详解
  • C++设计模式---模板方法模式
  • 数据结构和算法——绪论
  • 最小生成树算法的相关变形题
  • Android中常用的几种容器视图的使用
  • 随手记面试录
  • VMware软件下载安装以及在VMware中安装Centos-stream
  • JCL入门教程
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • 【面试系列】之二:关于js原型
  • es6(二):字符串的扩展
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • linux学习笔记
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • SpingCloudBus整合RabbitMQ
  • SQLServer之创建数据库快照
  • vue数据传递--我有特殊的实现技巧
  • WePY 在小程序性能调优上做出的探究
  • 闭包--闭包之tab栏切换(四)
  • 关于字符编码你应该知道的事情
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 学习使用ExpressJS 4.0中的新Router
  • 移动端解决方案学习记录
  • 优秀架构师必须掌握的架构思维
  • #vue3 实现前端下载excel文件模板功能
  • #Z2294. 打印树的直径
  • #考研#计算机文化知识1(局域网及网络互联)
  • (02)vite环境变量配置
  • (1)(1.13) SiK无线电高级配置(五)
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (ros//EnvironmentVariables)ros环境变量
  • (vue)页面文件上传获取:action地址
  • (第8天)保姆级 PL/SQL Developer 安装与配置
  • (附源码)springboot猪场管理系统 毕业设计 160901
  • (简单有案例)前端实现主题切换、动态换肤的两种简单方式
  • (蓝桥杯每日一题)love
  • (十) 初识 Docker file
  • (图)IntelliTrace Tools 跟踪云端程序
  • (幽默漫画)有个程序员老公,是怎样的体验?
  • (转) Android中ViewStub组件使用
  • (转) 深度模型优化性能 调参
  • .net oracle 连接超时_Mysql连接数据库异常汇总【必收藏】
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET/C# 使用 ConditionalWeakTable 附加字段(CLR 版本的附加属性,也可用用来当作弱引用字典 WeakDictionary)
  • .Net+SQL Server企业应用性能优化笔记4——精确查找瓶颈
  • .Net程序猿乐Android发展---(10)框架布局FrameLayout
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解