事件循环中的宏任务和微任务执行顺序

先来了解一下事件循环、宏任务、微任务和Promise

1.事件循环(Event Loop)运行机制

  1. 执行一个宏任务(栈中没有就从事件队列中获取)
  2. 执行过程中如果遇到微任务,就将它添加到微任务的任务队列中
  3. 宏任务执行完毕后,立即执行当前微任务队列中的所有微任务(依次执行)
  4. 当前宏任务执行完毕,开始检查渲染,然后GUI线程接管渲染
  5. 渲染完毕后,JS线程继续接管,开始下一个宏任务(从事件队列中获取)

2.宏任务、微任务

执行顺序: 先宏后微

宏任务(发起者:宿主(Node、浏览器)):
script(整体代码)、setTimeout、setInterval、setImmediate(Node.js 环境)、UI事件、I/O(Node.js)

微任务(发起者: JS引擎):
Promise、MutaionObserver、process.nextTick(Node.js)

3. Promise

定义: Promise对象用于表示一个异步操作的最终完成 (或失败)及其结果值

Promise把异步操作最终的成功返回值或者失败原因和相应的处理程序关联起来。 这样使得异步方法可以像同步方法那样返回值:异步方法并不会立即返回最终的值,而是会返回一个 promise,以便在未来某个时候把值交给使用者。
1.promise构造函数是同步执行,then方法是异步执行
2.微任务(入队的Promise回调)的优先级高于宏任务(入队的setTimeout()回调)

4.例子演示

      setTimeout(() => {console.log("4");setTimeout(() => {console.log("8");}, 0);new Promise((r) => {console.log("5");//构造函数是同步的r();}).then(() => {console.log("7");//then()是异步的,这里已经入队});console.log("6");}, 0);new Promise((r) => {console.log("1");//构造函数是同步的r();}).then(() => {console.log("3");//then()是异步的,这里已经入队});console.log("2");

运行结果:

5.执行流程与总结

总结: 在执行 宏任务 之前,要先把已入队的 微任务 全部执行完,再执行下一条 宏任务

如果说法有错误,欢迎指正!

事件循环中的宏任务和微任务执行顺序相关推荐

  1. JS事件循环中的宏任务和微任务执行顺序

    1. 宏任务和微任务事件 其中微任务的优先级高于宏任务,括号内为事件运行环境 宏任务 微任务 I/O事件/onClick点击事件 process.netTick (Node) setTimeout N ...

  2. 宏任务和微任务执行顺序_确保任务的执行顺序

    宏任务和微任务执行顺序 有时有必要对线程池中的任务施加一定的顺序. JavaSpecialists通讯的第206期提出了一种这样的情况:我们使用NIO从多个连接中读取数据. 我们需要确保来自给定连接的 ...

  3. 宏任务与微任务执行顺序(超详细讲解)

    前言 写此之前,也查阅了很多文章,并结合自己的理解,说说对Event Loop模型的理解.以及对Promise.async/await在任务队列中的影响进行了分析,也给出了多种情形的任务案例以及分析解 ...

  4. 简单易懂的宏任务和微任务执行顺序

    背景 很多朋友在写面试题:宏任务与微任务的执行时机时,容易犯迷糊.之前我也写过两篇文章,这次加上详细的讲解,让大家更容易理解. 什么是宏任务.微任务? 1.首先要称得上是宏任务.微任务的,必须是一个回 ...

  5. JavaScript中的宏任务和微任务

    先来个例子 如果能很快知道执行的顺序结果,那么说明你对这块的内容理解非常深刻. <div class="parent" data-spm="2.2.2.2" ...

  6. 在事件循环中使用暂停器

    问题描述 在典型的应用程序堆栈中,多个线程用于服务事件.处理数据.流水线等.一个重要的设计考虑是线程如何意识到有工作要做,一些通用方法包括: 信号/通知:在这种情况下,接收线程让步(即,被添加到等待队 ...

  7. 探究点击事件在JavaScript事件循环中的表现

    JavaScript的事件循环event loop很多文章都写的非常详细了.这里也不多做介绍. 在很多文章中都有介绍鼠标事件Mouse Event是属于macrotask.本文探究一下Mouse Ev ...

  8. ❤️一起谈一谈js中的宏任务和微任务!

    前面面试的文章中我们说过一道关于宏任务和微任务的题: setTimeout(function(){console.log('1') });new Promise(function(resolve){c ...

  9. 【JS】JavaScript中的宏任务和微任务

    目录 概念 宏任务 微任务 运行机制 总结 js是一门单线程语言,所以它本身是不可能异步的,但是js的宿主环境(比如浏览器.node)是多线程,宿主环境通过某种方式(事件驱动)使得js具备了异步的属性 ...

最新文章

  1. GPU上如何优化卷积
  2. 目前付款申请单内网打开慢的问题
  3. js 矩阵转置_js对象数组矩阵转置(行转列)的实践
  4. docker的daemon.json基本配置
  5. 分享一个HTML5画布实现的超酷文字弹跳球效果
  6. java 使用适当的签名_关于数字签名和policy文件设置!
  7. Python 中argparse模块的使用
  8. JavaWeb学习笔记-kuangshen
  9. 如何做带宽估计和丢包策略
  10. SNF快速开发平台MVC-各种级联绑定方式,演示样例程序(包含表单和表格控件)...
  11. 函数式编程之一柯里化
  12. Mysql一些重要配置参数的学习与整理(二)
  13. Windows上配置iPhone开发环境
  14. hadoop集群安装配置
  15. 2022电工杯B题思路模型分析
  16. MT6762/MT6763处理器参数比较,MT6762参考设计资料介绍
  17. 《彩虹屁》快夸夸我!彩虹屁生成器
  18. python爬虫:xpath解析
  19. 数据链路层学习之LLDP
  20. Pycharm 报错 Environment location directory is not empty 解决

热门文章

  1. iOS 开发面试通关指南:67 个必知问题!
  2. 疫时急速挑战,AI 落地大考
  3. 天才?骗子?解析Deep Tech
  4. 华为回应关于“获政府巨额补贴”报道;最高法:微信微博聊天记录可作为证据;GoLand 2020.1 路线图公布 | 极客头条...
  5. 全球 42 亿 IPv4 地址宣告耗尽!
  6. 技术开发者该如何开展小团队的微服务之路?
  7. 前端也能玩转机器学习?Google Brain 工程师来支招!
  8. 刷爆了!Java蝉联5次第一,网友:最强王者!附70k架构师Java学习路线
  9. Google AI 骗过了 Google,工程师竟无计可施?
  10. 进入多个页签_俄罗斯学生落地签如何办理?