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 更严格的相等 [译]
Sep 20 Javascript
javascript实现图片切换的幻灯片效果源代码
Dec 12 Javascript
jQuery实现表头固定效果的实例代码
May 24 Javascript
jQuery制作可自定义大小的拼图游戏
Mar 30 Javascript
深入理解JS addLoadEvent函数
May 20 Javascript
把多个JavaScript函数绑定到onload事件处理函数上的方法
Sep 04 Javascript
vue.js中$watch的用法示例
Oct 04 Javascript
Angular.JS学习之依赖注入$injector详析
Oct 20 Javascript
JS改变页面颜色源码分享
Feb 24 Javascript
vue+element-ui+ajax实现一个表格的实例
Mar 09 Javascript
vue 数据遍历筛选 过滤 排序的应用操作
Nov 17 Javascript
Vue实现跑马灯样式文字横向滚动
Nov 23 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
Apache, PHP在Windows 9x/NT下的安装与配置 (一)
2006/10/09 PHP
smarty巧妙处理iframe中内容页的代码
2012/03/07 PHP
php中smarty实现多模版网站的方法
2015/06/11 PHP
List Installed Hot Fixes
2007/06/12 Javascript
JQUERY 对象与DOM对象之两者相互间的转换
2009/04/27 Javascript
jQueryUI DatePicker 添加时分秒
2016/06/04 Javascript
jQuery获取多种input值的简单实现方法
2016/06/20 Javascript
基于jQuery实现发送短信验证码后的倒计时功能(无视页面关闭)
2016/09/02 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
DOM 事件的深入浅出(二)
2016/12/05 Javascript
基于JavaScript实现全选、不选和反选效果
2017/02/15 Javascript
微信小程序实现给循环列表添加点击样式实例
2017/04/26 Javascript
react开发教程之React 组件之间的通信方式
2017/08/12 Javascript
H5+C3+JS实现双人对战五子棋游戏(UI篇)
2020/05/28 Javascript
聊聊Vue中provide/inject的应用详解
2019/11/10 Javascript
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
Python的Django应用程序解决AJAX跨域访问问题的方法
2016/05/31 Python
python如何将图片转换为字符图片
2020/08/19 Python
Python进程间通信Queue消息队列用法分析
2019/05/22 Python
PyQt5笔记之弹出窗口大全
2019/06/20 Python
django foreignkey外键使用的例子 相当于left join
2019/08/06 Python
详解python破解zip文件密码的方法
2020/01/13 Python
服务器端jupyter notebook映射到本地浏览器的操作
2020/04/14 Python
Python爬虫requests库多种用法实例
2020/05/28 Python
keras 两种训练模型方式详解fit和fit_generator(节省内存)
2020/07/03 Python
python编写扎金花小程序的实例代码
2021/02/23 Python
VIVOBAREFOOT赤脚鞋:让您的脚做自然的事情
2017/06/01 全球购物
美国孕妇装品牌:Destination Maternity
2018/02/04 全球购物
影视制作岗位职责
2013/12/04 职场文书
敬老院活动总结
2014/04/28 职场文书
考试保密承诺书
2014/08/30 职场文书
先进事迹材料范文
2014/12/29 职场文书
JavaScript中MutationObServer监听DOM元素详情
2021/11/27 Javascript
解决vue中provide inject的响应式监听
2022/04/19 Vue.js
win10电脑老是死机怎么办?win10系统老是死机的解决方法
2022/08/05 数码科技