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 相关文章推荐
javascript OFFICE控件测试代码
Dec 08 Javascript
javascript 隐藏/显示指定的区域附HTML元素【legend】用法
Mar 05 Javascript
解决遍历时Array.indexOf产生的性能问题
Jul 03 Javascript
JavaScript eval() 函数介绍及应用示例
Jul 29 Javascript
jQuery实现统计复选框选中数量
Nov 24 Javascript
JS判断网页广告是否被浏览器拦截过滤的代码
Apr 05 Javascript
AngularJS实用开发技巧(推荐)
Jul 13 Javascript
Node.js pipe实现源码解析
Aug 12 Javascript
zTree获取当前节点的下一级子节点数实例
Sep 05 Javascript
Node.js爬取豆瓣数据实例分析
Mar 05 Javascript
原生JS实现的轮播图功能详解
Aug 06 Javascript
微信小程序设置全局请求URL及封装wx.request请求操作示例
Apr 02 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/02/26 PHP
php中分页及SqlHelper类用法实例
2017/01/12 PHP
jquery中dom操作和事件的实例学习 下拉框应用
2011/12/01 Javascript
Javascript中的delete介绍
2012/09/02 Javascript
鼠标移动到图片名上,显示图片的简单实例
2013/07/14 Javascript
jquery插件开发之实现md5插件
2014/03/17 Javascript
jquery选择器排除某个DOM元素的方法(实例演示)
2014/04/25 Javascript
jQuery+css3实现Ajax点击后动态删除功能的方法
2015/08/10 Javascript
详解从Node.js的child_process模块来学习父子进程之间的通信
2017/03/27 Javascript
js实现股票实时刷新数据案例
2017/05/14 Javascript
微信小程序tabbar不显示解决办法
2017/06/08 Javascript
JavaScript中in和hasOwnProperty区别详解
2017/08/04 Javascript
Bootstrap Table中的多选框删除功能
2018/07/15 Javascript
Vue常用指令详解分析
2018/08/19 Javascript
微信小程序音乐播放器开发
2019/11/20 Javascript
[27:08]完美世界DOTA2联赛PWL S2 SZ vs Rebirth 第二场 11.21
2020/11/23 DOTA
Python cookbook(数据结构与算法)实现优先级队列的方法示例
2018/02/18 Python
Pandas读取并修改excel的示例代码
2019/02/17 Python
python导入pandas具体步骤方法
2019/06/23 Python
python虚拟环境的安装和配置(virtualenv,virtualenvwrapper)
2019/08/09 Python
python实现单链表的方法示例
2019/09/03 Python
Django中使用Celery的方法步骤
2020/12/07 Python
Shopee马来西亚:随拍即卖,最佳行动电商拍卖平台
2017/06/05 全球购物
美国综合购物商城:UnbeatableSale.com
2018/11/28 全球购物
俄罗斯购买内衣网站:Trusiki
2020/08/22 全球购物
面向对象编程OOP的优点
2013/01/22 面试题
值传递还是引用传递
2015/02/08 面试题
J2EE面试题集锦(附答案)
2013/08/16 面试题
如何客观的进行自我评价
2013/12/17 职场文书
教师党员公开承诺事项
2014/05/28 职场文书
企业消防安全责任书
2014/07/23 职场文书
节能环保家庭事迹材料
2014/08/27 职场文书
基层党员干部四风问题整改方向和措施
2014/09/25 职场文书
2014年办公室文秘工作总结
2014/12/09 职场文书
幼儿园体操比赛口号
2015/12/25 职场文书
Python绘制散乱的点构成的图的方法
2022/04/21 Python