JS异步宏队列与微队列原理区别详解


Posted in Javascript onJuly 02, 2020

1. 原理图

JS异步宏队列与微队列原理区别详解

2. 说明

JS 中用来存储待执行回调函数的队列包含 2 个不同特定的列队

  • 宏列队:用来保存待执行的宏任务(回调),比如:定时器回调、DOM 事件回调、ajax 回调
  • 微列队:用来保存待执行的微任务(回调),比如:promise的回调、MutationObserver 的回调

JS 执行时会区别这 2 个队列

  • JS 引擎首先必须先执行所有的初始化同步任务代码
  • 每次准备取出第一个宏任务执行前, 都要将所有的微任务一个一个取出来执行,也就是优先级比宏任务高,且与微任务所处的代码位置无关

下面这个例子可以看出Promise要先于setTimeout执行:

setTimeout(() => { //立即放入宏队列
   console.log('timeout callback1()')
   Promise.resolve(3).then(
    value => { //立即放入微队列
     console.log('Promise onResolved3()', value)
    }
   )
  }, 0)

  setTimeout(() => { //立即放入宏队列
   console.log('timeout callback2()')
  }, 0)

  Promise.resolve(1).then(
   value => { //立即放入微队列
    console.log('Promise onResolved1()', value)
    setTimeout(() => {
     console.log('timeout callback3()', value)
    }, 0)
   }
  )

  Promise.resolve(2).then(
   value => { //立即放入微队列
    console.log('Promise onResolved2()', value)
   }
  )

  // Promise onResolved1() 1
  // Promise onResolved2() 2
  // timeout callback1()
  // Promise onResolved3() 3
  // timeout callback2()
  // timeout callback3() 1

3. 相关题目

代码一:

// 3 7 4 1 2 5
  /*
  宏: []
  微: []
  */
  const first = () => (new Promise((resolve, reject) => {
   console.log(3)
   let p = new Promise((resolve, reject) => {
    console.log(7)
    setTimeout(() => {
     console.log(5)
     resolve(6) //会被忽略,因为会先执行微队列里的resolve(1),此时状态已经改变过了,且状态只能改变一次
    }, 0)
    resolve(1)
   })
   resolve(2)
   p.then((arg) => {
    console.log(arg)
   })
  }))

  first().then((arg) => {
   console.log(arg)
  })
  console.log(4)

代码二:

// 1 7 2 3 8 4 6 5 0   
  setTimeout(() => {
   console.log("0")
  }, 0)
  new Promise((resolve, reject) => {
   console.log("1")
   resolve()
  }).then(() => {
   console.log("2")
   new Promise((resolve, reject) => {
    console.log("3")
    resolve()
   }).then(() => {
    console.log("4")
   }).then(() => {
    console.log("5")
   })
  }).then(() => {
   console.log("6")
  })

  new Promise((resolve, reject) => {
   console.log("7")
   resolve()
  }).then(() => {
   console.log("8")
  })

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery 小练习(实例代码)
Aug 07 Javascript
javascript 上下banner替换具体实现
Nov 14 Javascript
使用js解决由border属性引起的div宽度问题
Nov 26 Javascript
探讨js字符串数组拼接的性能问题
Oct 11 Javascript
JavaScript阻止浏览器返回按钮的方法
Mar 18 Javascript
学习JavaScript设计模式之模板方法模式
Jan 20 Javascript
js实现纯前端的图片预览
Apr 27 Javascript
js轮播图代码分享
Jul 14 Javascript
JS获取及验证开始结束日期的方法
Aug 20 Javascript
node.js实现登录注册页面
Apr 08 Javascript
js实现图片上传并预览功能
Aug 06 Javascript
JavaScript鼠标悬停事件用法解析
May 15 Javascript
微信小程序自定义扫码功能界面的实现代码
Jul 02 #Javascript
JS字符串和数组如何实现相互转化
Jul 02 #Javascript
Vue父子之间值传递的实例教程
Jul 02 #Javascript
JS出现404错误原理及解决方案
Jul 01 #Javascript
vue结合el-upload实现腾讯云视频上传功能
Jul 01 #Javascript
详解vue3.0 diff算法的使用(超详细)
Jul 01 #Javascript
mapboxgl区划标签避让不遮盖实现的代码详解
Jul 01 #Javascript
You might like
php5 and xml示例
2006/11/22 PHP
追求程序速度,而不是编程的速度
2008/04/23 PHP
配置Apache2.2+PHP5+CakePHP1.2+MySQL5运行环境
2009/04/25 PHP
PHP 微信支付类 demo
2015/11/30 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
FF IE兼容性的修改小结
2009/09/02 Javascript
Javascript 通过json自动生成Dom的代码
2010/04/01 Javascript
table行随鼠标移动变色示例
2014/05/07 Javascript
JavaScript中number转换成string介绍
2014/12/31 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
微信小程序 限制1M的瘦身技巧与方法详解
2017/01/06 Javascript
微信小程序 wx.login解密出现乱码的问题解决办法
2017/03/10 Javascript
JS库之Waypoints的用法详解
2017/09/13 Javascript
Vue2.0仿饿了么webapp单页面应用详细步骤
2018/07/08 Javascript
浅析JavaScript异步代码优化
2019/03/18 Javascript
vue 实现cli3.0中使用proxy进行代理转发
2019/10/30 Javascript
原生js实现ajax请求和JSONP跨域请求操作示例
2020/03/14 Javascript
javascript设计模式 ? 策略模式原理与用法实例分析
2020/04/21 Javascript
vue 获取元素额外生成的data-v-xxx操作
2020/09/09 Javascript
python实现名片管理系统
2018/11/29 Python
在Python中调用Ping命令,批量IP的方法
2019/01/26 Python
Python制作动态字符图的实例
2019/01/27 Python
python多进程下实现日志记录按时间分割
2019/07/22 Python
使用Python实现分别输出每个数组
2019/12/06 Python
CSS3制作3D立方体loading特效
2020/11/09 HTML / CSS
很酷的HTML5电子书翻页动画特效
2016/02/25 HTML / CSS
canvas 如何绘制线段的实现方法
2018/07/12 HTML / CSS
PyQt QMainWindow的使用示例
2021/03/24 Python
追悼会子女答谢词
2014/01/28 职场文书
大专会计自我鉴定
2014/02/06 职场文书
工作决心书范文
2014/03/11 职场文书
加强干部作风建设整改方案
2014/10/24 职场文书
廉洁自律个人总结
2015/02/14 职场文书
汉语拼音教学反思
2016/02/22 职场文书
Python3.8官网文档之类的基础语法阅读
2021/09/04 Python
MySQL远程无法连接的一些常见原因总结
2022/09/23 MySQL