宏任务、微任务在时间循环中的执行

news/2024/10/21 6:01:25/

如何描述事件循环,及里面宏任务、微任务的执行过程

      • 事件循环相关描述
      • 事件循环流程图
      • 案例
          • 案例代码
          • 案例解析

事件循环相关描述

  • 为什么有事件循环
    • 解决js单线程工作,会堵塞程序的问题
  • 单线程任务类型
    • 同步任务:在主线程上排队,直接执行
    • 异步任务:不进入主线程,进入任务队列等待执行
      • 微任务 (Micro/Job)
        • 包含 Promise.then/cath /finally,MutationObserver回调(html5新特性)
      • 宏任务 (MacroTask/Task)
        • 包含script、setTimeout、setInterval 、setImmediate、I/O操作
    • 一个宏任务里的微任务 没执行完的话,不会执行下一个宏任务

事件循环流程图

Created with Raphaël 2.3.0 宏任务 任务结束 当前宏任务中是否有微任务 执行当前宏任务中的微任务 下一个宏任务 yes no

案例

案例代码
console.log(1);
// setTimeout是异步的宏任务。
setTimeout(() => {console.log(2,);Promise.resolve().then(() => {console.log(3,);});
});// (同步)立即执行
const pA = new Promise((resolve, reject) => {console.log(4,);resolve(5);
}).then((data) => {// then()是异步里面的微任务console.log(5,data,);setTimeout(() => {console.log(7,);}, 0);return data;
});pA.then((res) => {// 这里等价于 5console.log(8, 'res====', res);
});setTimeout(() => {console.log(6,);
});// 最终输出结果依次为 1/4/5/8/2/3/6/7
案例解析
  1. 整个script宏任务作为第一次事件循环 ,
    1.1 输出 【1】
    1.2 遇到 setTimeout2,放入任务队列第1位;
    1.3 遇到同步的4,输出 【4】;4里面立即调用了resolve,将 5/8放到次轮微任务;
    1.4 遇到 setTimeout6,放入任务队列第2位;
    1.5 第一轮事件循环宏任务结束;
    1.6 检查第一轮里面有没有微任务,有1.3的5/8,输出【5/8】,5后面有setTimeout7,放到任务队列第3位
    1.7 第一轮事件循环微任务结束,进行下一个事件循环;
  2. 宏任务里面的第一个为 setTimeout2,
    2.1 输出【2】,里面立即调用了resolve,将 3放到次轮微任务
    2.2 setTimeout2 这个宏任务结束,执行里面的微任务,输出【3】
    2.3. 第二轮事件循环微任务结束,进行下一个事件循环;
  3. 宏任务里面的第二个为 setTimeout6,输出【6】,没有微任务,第三轮结束
  4. 宏任务里面的第三个为 setTimeout7,输出【7】,没有微任务,第四轮结束

http://www.ppmy.cn/news/66118.html

相关文章

南京邮电大学数据库实验一(SQL语言)

文章目录 一、 实验目的和要求二、实验环境(实验设备)三、实验原理及内容1、了解并掌握SQL*Plus环境的使用2、用SQL的DDL语句图书管理系统创建基表3、为基表“读者”补充定义:职称只能取初级、中级、高级之一。4、用SQL的DML语句向上述基表中增加、修改和删除数据5、…

MySQL数据库——MySQL修改存储过程(ALTER PROCEDURE)

在实际开发过程中,业务需求修改的情况时有发生,所以修改 MySQL 中的存储过程是不可避免的。 MySQL 中通过 ALTER PROCEDURE 语句来修改存储过程。下面将详细讲解修改存储过程的方法。 MySQL 中修改存储过程的语法格式如下: ALTER PROCEDURE…

InnoDB线程模型

新版本结构演变 MySQL 5.7 版本 将 Undo日志表空间从共享表空间 ibdata 文件中分离出来,可以在安装 MySQL 时由用户自行指定文件大小和数量增加了 temporary 临时表空间,里面存储着临时表或临时查询结果集的数据Buffer Pool 大小可以动态修改&#xff0…

【最新可用】chatGPT镜像网站国内使用,免费稳定!

新建了一个网站 https://ai.weoknow.com/ 每天给大家更新可用的国内可用chatGPT 2023.5.8新增一个 ChatGPT 国内免翻版 【网站名称】:Chat GPT Ai 【使用环境】:移动端/电脑网页端 ChatGPT是一款功能强大的免费在线聊天机器人,具有人工智能…

Java分布式事务(十八)

文章目录 🔥最终一致性分布式事务解决方案_什么是最大努力通知型分布式事务🔥最大努力通知型分布式事务_最大努力通知与可靠消息最终一致性的区别🔥最大努力通知型分布式事务解决方案🔥最大努力通知型分布式事务_案例业务说明🔥最大努力通知型分布式事务实战_实现充值…

docker学习笔记(二)

目录 启动Docker ​编辑 建立 Docker 用户 ​编辑 测试 Docker 是否正常工作 卸载Docker Docker镜像加速器配置 配置镜像 检查加速器是否生效 如何在Linux中的.json文件下保存并退出 如果我是使用vi操作进来的,我该如何保存并退出呢? 如何在Li…

RUST 每日一省:解引用Deref

“解引用”(Deref) 是“取引用”(Ref) 的反操作。 取引用, 我们有&、 &mut等操作符, 对应的, 解引用, 我们有*操作符。 默认的“取引用”、 “解引用”操作是互补抵消的关系…

ChatGPT被封?了解这些原因避免账号被封!

随着企业数字化转型的加速,传统的商业模式正在被颠覆,越来越多的企业开始使用人工智能技术来推动业务发展。ChatGPT作为一种自然语言处理技术,可以通过对话方式回答用户的问题或提供信息,在企业市场营销、客户服务、销售等方面发挥…