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 相关文章推荐
jquery常用技巧及常用方法列表集合
Apr 06 Javascript
JQuery的read函数与js的onload不同方式实现
Mar 18 Javascript
自定义ExtJS控件之下拉树和下拉表格附源码
Oct 15 Javascript
Jquery跳到页面指定位置的方法
May 12 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
Jun 06 Javascript
微信小程序 Toast自定义实例详解
Jan 20 Javascript
JavaScript30 一个月纯 JS 挑战中文指南(英文全集)
Jul 23 Javascript
vue按需引入element Transfer 穿梭框
Sep 30 Javascript
结合mint-ui移动端下拉加载实践方法总结
Nov 08 Javascript
vue组件中使用iframe元素的示例代码
Dec 13 Javascript
在小程序中使用Echart图表的示例代码
Aug 02 Javascript
使用jquery的cookie实现登录页记住用户名和密码的方法
Mar 13 jQuery
微信小程序自定义扫码功能界面的实现代码
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中截取字符串支持utf-8
2007/01/18 PHP
php 图片加水印与上传图片加水印php类
2010/05/12 PHP
php getimagesize 上传图片的长度和宽度检测代码
2010/05/15 PHP
PHP源代码数组统计count分析
2011/08/02 PHP
php验证邮箱和ip地址最简单方法汇总
2015/10/30 PHP
新手入门常用代码集锦
2007/01/11 Javascript
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
jquery 问答知识整理
2010/02/11 Javascript
零基础搭建Node.js、Express、Ejs、Mongodb服务器及应用开发入门
2014/12/20 Javascript
JavaScript生成带有缩进的表格代码
2016/06/15 Javascript
Bootstrap面板(Panels)的简单实现代码
2017/03/17 Javascript
Layer组件多个iframe弹出层打开与关闭及参数传递的方法
2019/09/25 Javascript
vue和H5 draggable实现拖拽并替换效果
2020/07/29 Javascript
Python Web框架Flask中使用百度云存储BCS实例
2015/02/08 Python
python中解析json格式文件的方法示例
2017/05/03 Python
利用Tkinter和matplotlib两种方式画饼状图的实例
2017/11/06 Python
用不到50行的Python代码构建最小的区块链
2017/11/16 Python
使用实现pandas读取csv文件指定的前几行
2018/04/20 Python
django实现web接口 python3模拟Post请求方式
2019/11/19 Python
Python爬虫库BeautifulSoup的介绍与简单使用实例
2020/01/25 Python
基于Python生成个性二维码过程详解
2020/03/05 Python
python快速安装OpenCV的步骤记录
2021/02/22 Python
钉钉企业内部H5微应用开发详解
2020/05/12 HTML / CSS
Clarins娇韵诗美国官网:法国天然护肤品牌
2016/09/26 全球购物
One.com挪威:北欧成长最快的网络托管公司
2016/11/19 全球购物
澳大利亚手表品牌:Time IV Change
2018/10/06 全球购物
Yahoo-PHP面试题2
2014/12/06 面试题
销售自荐信
2013/10/22 职场文书
如何掌握自荐信格式呢
2013/11/19 职场文书
高一数学教学反思
2014/02/07 职场文书
生产厂长岗位职责
2014/02/21 职场文书
营销与策划实训报告
2014/11/05 职场文书
2015年信访维稳工作总结
2015/04/07 职场文书
国庆节新闻稿
2015/07/17 职场文书
国家助学金受助感言
2015/08/01 职场文书
社区干部培训心得体会
2016/01/06 职场文书