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 相关文章推荐
个人总结的一些关于String、Function、Array的属性和用法
Jan 10 Javascript
javascript AOP 实现ajax回调函数使用比较方便
Nov 20 Javascript
dotopAlert 提示用户需安装播放器的代码
Sep 17 Javascript
javascript 保存文件到本地实现方法
Nov 29 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
Apr 29 Javascript
jQuery及JS实现循环中暂停的方法
Feb 02 Javascript
用Node.js通过sitemap.xml批量抓取美女图片
May 28 Javascript
VS Code转换大小写、修改选中文字或代码颜色的方法
Dec 15 Javascript
js回调函数仿360开机
Dec 26 Javascript
详解vue beforeEach 死循环问题解决方法
Feb 25 Javascript
详解Vue的组件中data选项为什么必须是函数
Aug 17 Javascript
ReactRouter的实现方法
Jan 25 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
PHP实现单例模式最安全的做法
2014/06/13 PHP
PHP输出日历表代码实例
2015/03/27 PHP
PHP如何将XML转成数组
2016/04/04 PHP
学习YUI.Ext 第六天--关于树TreePanel(Part 1)
2007/03/10 Javascript
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
有趣的JavaScript数组长度问题代码说明
2011/01/20 Javascript
javascript小组件 原生table排序表格脚本(兼容ie firefox opera chrome)
2012/07/25 Javascript
浅谈JavaScript字符集
2014/05/22 Javascript
jquery中checkbox使用方法简单实例演示
2015/11/24 Javascript
JavaScript正则表达式的分组匹配详解
2016/02/13 Javascript
Node.js实用代码段之获取Buffer对象字节长度
2016/03/17 Javascript
python读写二进制文件的方法
2015/05/09 Python
python 表达式和语句及for、while循环练习实例
2017/07/07 Python
Python实现的简单排列组合算法示例
2018/07/04 Python
Scrapy框架使用的基本知识
2018/10/21 Python
opencv实现静态手势识别 opencv实现剪刀石头布游戏
2019/01/22 Python
Python使用itcaht库实现微信自动收发消息功能
2020/07/13 Python
python 多线程中join()的作用
2020/10/29 Python
html5+css3之CSS中的布局与Header的实现
2014/11/21 HTML / CSS
利用CSS3 动画 绘画 圆形动态时钟
2018/03/20 HTML / CSS
芝加哥牛排公司:Chicago Steak Company
2018/10/31 全球购物
北京一家公司的.net开发工程师笔试题
2012/04/17 面试题
大学生就业自荐信
2013/10/26 职场文书
新领导上任欢迎词
2014/01/13 职场文书
追悼会子女答谢词
2014/01/28 职场文书
客户接待方案
2014/02/26 职场文书
遗嘱继承公证书
2014/04/09 职场文书
服装发布会策划方案
2014/05/22 职场文书
毕业生工作求职信
2014/06/30 职场文书
岗位安全生产责任书
2014/07/28 职场文书
最美家庭活动方案
2014/08/31 职场文书
办公室文员岗位职责
2015/02/04 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
城南旧事观后感
2015/06/11 职场文书
关于开学的感想
2015/08/10 职场文书
关于maven依赖 ${xxx.version}报错问题
2022/01/18 Java/Android