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 相关文章推荐
常用js脚本
Dec 03 Javascript
深入理解JavaScript系列(1) 编写高质量JavaScript代码的基本要点
Jan 15 Javascript
window.onresize 多次触发的解决方法
Nov 08 Javascript
如何设置一定时间内只能发送一次请求
Feb 28 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
Jun 19 Javascript
js实现带进度条提示的多视频上传功能
Dec 13 Javascript
vue2.0 和 animate.css的结合使用
Dec 12 Javascript
js实时监控文本框输入字数的实例代码
Jan 18 Javascript
vue移动端微信授权登录插件封装的实例
Aug 28 Javascript
微信小程序解除10个请求并发限制
Dec 18 Javascript
vue生命周期与钩子函数简单示例
Mar 13 Javascript
详解vue路由
Aug 05 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
收听短波不可能有声音清晰的品质吗
2021/03/01 无线电
千呼万唤始出来,DOTA2勇士令状不朽宝藏Ⅱ现已推出
2020/08/25 DOTA
PHP单例模式详解及实例代码
2016/12/21 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
PHP面向对象程序设计__tostring()和__invoke()用法分析
2019/06/12 PHP
jquery.validate使用攻略 第三部
2010/07/01 Javascript
JavaScript(js)设置默认输入焦点(focus)
2012/12/28 Javascript
jQuery打印图片pdf、txt示例代码
2014/07/22 Javascript
angularjs自定义ng-model标签的属性
2016/01/21 Javascript
jQuery对象的链式操作用法分析
2016/05/10 Javascript
前端微信支付js代码
2016/07/25 Javascript
leaflet的开发入门教程
2016/11/17 Javascript
Vue自定义指令实现checkbox全选功能的方法
2018/02/28 Javascript
vue.js打包之后可能会遇到的坑!
2018/06/03 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
[01:02]DOTA2辉夜杯决赛日 CDEC.Y对阵VG赛前花絮
2015/12/27 DOTA
Python牛刀小试密码爆破
2011/02/03 Python
python中os操作文件及文件路径实例汇总
2015/01/15 Python
django数据库migrate失败的解决方法解析
2018/02/08 Python
python3 pandas 读取MySQL数据和插入的实例
2018/04/20 Python
python脚本实现验证码识别
2018/06/07 Python
Python实现的在特定目录下导入模块功能分析
2019/02/11 Python
详解Python3 基本数据类型
2019/04/19 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
Python3实现英文字母转换哥特式字体实例代码
2020/09/01 Python
Fairyseason:为个人和批发商提供女装和配件
2017/03/01 全球购物
Haglöfs瑞典官方网站:haglofs火柴棍,欧洲顶级户外品牌
2018/10/18 全球购物
全球在线商店:BerryLook
2019/04/14 全球购物
音乐表演专业毕业生求职信
2013/10/14 职场文书
农救科工作职责
2013/11/27 职场文书
干部培训自我鉴定
2014/01/22 职场文书
司马光教学反思
2014/02/01 职场文书
原料仓仓管员岗位职责
2014/07/08 职场文书
服务整改报告
2014/11/06 职场文书
2015年个人剖析材料范文
2014/12/29 职场文书
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js