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 相关文章推荐
IE与firefox下Dhtml的一些区别小结
Dec 02 Javascript
js和css写一个可以自动隐藏的悬浮框
Mar 05 Javascript
javascript学习笔记(五)原型和原型链详解
Oct 08 Javascript
js面向对象之常见创建对象的几种方式(工厂模式、构造函数模式、原型模式)
Nov 09 Javascript
Jqgrid之强大的表格插件应用
Dec 02 Javascript
Bootstrap 附加导航(Affix)插件实例详解
Jun 01 Javascript
微信小程序ajax实现请求服务器数据及模版遍历数据功能示例
Dec 15 Javascript
vue.js学习笔记之v-bind和v-on解析
May 03 Javascript
详解如何模拟实现node中的Events模块(通俗易懂版)
Apr 15 Javascript
JavaScript实现PC端四格密码输入框功能
Feb 19 Javascript
vue-router 按需加载 component: () => import() 报错的解决
Sep 22 Javascript
springboot+vue实现文件上传下载
Nov 17 Vue.js
微信小程序自定义扫码功能界面的实现代码
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在Apache下的两种模式的安装
2006/09/05 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
当jQuery遭遇CoffeeScript的时候 使用分享
2011/09/17 Javascript
jquery插件制作 图片走廊 gallery
2012/08/17 Javascript
javascript对select标签的控制(option选项/select)
2013/01/31 Javascript
JQuery遍历json数组的3种方法
2014/11/08 Javascript
JavaScript实现cookie的写入、读取、删除功能
2015/11/05 Javascript
浅谈Angular的$q, defer, promise
2016/12/20 Javascript
Node.js 异步异常的处理与domain模块解析
2017/05/10 Javascript
vue中配置mint-ui报css错误问题的解决方法
2017/10/11 Javascript
解决select2在bootstrap modal中不能正常使用的问题
2018/08/09 Javascript
微信小程序功能之全屏滚动效果的实现代码
2018/11/22 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
2019/05/10 Javascript
vue使用代理解决请求跨域问题详解
2019/07/24 Javascript
layer iframe 设置关闭按钮的方法
2019/09/12 Javascript
解决layui中onchange失效以及form动态渲染失效的问题
2019/09/27 Javascript
如何正确解决VuePress本地访问出现资源报错404的问题
2020/12/03 Vue.js
[02:10]探秘浦东源深体育馆 DOTA2 Supermajor不见不散
2018/05/17 DOTA
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
2016/09/21 Python
python3中dict(字典)的使用方法示例
2017/03/22 Python
Python使用Scrapy保存控制台信息到文本解析
2017/12/27 Python
Flask框架响应、调度方法和蓝图操作实例分析
2018/07/24 Python
python模拟登陆,用session维持回话的实例
2018/12/27 Python
python subprocess pipe 实时输出日志的操作
2020/12/05 Python
python自动打开浏览器下载zip并提取内容写入excel
2021/01/04 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
美国眼镜网站:EyeBuyDirect
2017/04/13 全球购物
校园十大歌手策划书
2014/02/01 职场文书
环保建议书600字
2014/05/14 职场文书
中学生思想品德评语
2014/12/31 职场文书
数学教师个人总结
2015/02/06 职场文书
学期个人工作总结
2015/02/13 职场文书
个人年度总结报告
2015/03/09 职场文书
交通事故代理词范文
2015/05/23 职场文书
2016年119消防宣传日活动总结
2016/04/05 职场文书
Nginx + consul + upsync 完成动态负载均衡的方法详解
2021/03/31 Servers