JS异步宏队列微队列原理详解


Posted in Javascript onSeptember 09, 2020

先看一张我绘制的原理图

JS异步宏队列微队列原理详解

原理图

setImmediate 也是宏任务,在 Node 环境下,微任务还有 process.nextTick

JS 中用来存储待执行回调函数的队列包含 2 个不同特定的列队

  • 宏列队:用来保存待执行的宏任务(回调),比如:定时器回调、DOM 事件回调、ajax 回调微
  • 列队:用来保存待执行的微任务(回调),比如:promise的回调、MutationObserver 的回调

JS 执行时会区别这 2 个队列

  • JS 引擎首先必须先执行所有的初始化同步任务代码
  • 每次准备取出第一个宏任务执行前, 都要将所有的微任务一个一个取出来执行,也就是优先级比宏任务高,且与微任务所处的代码位置无关

下面这个例子可以看出 Promise 要先于 setTimeout 执行

setTimeout(() => { // 立即放入宏队列
  console.log('settimeout callback1()');
}, 0);
setTimeout(() => { // 立即放入宏队列
  console.log('settimeout callback2()');
}, 0);


Promise.resolve(1).then(value => { // 立即放入微队列
  console.log('Promise onResolved1()', value);
})
Promise.resolve(2).then(value => { // 立即放入微队列
  console.log('Promise onResolved2()', value);
})

// Promise onResolved1() 1
// Promise onResolved2() 2
// settimeout callback1()
// settimeout callback2()

全文完。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JQuery 图片延迟加载并等比缩放插件
Nov 09 Javascript
鼠标滚轴控制文本框值的JS代码
Nov 19 Javascript
jquery中get,post和ajax方法的使用小结
Feb 04 Javascript
JQuery给网页更换皮肤的方法
May 30 Javascript
Node连接mysql数据库方法介绍
Feb 07 Javascript
jquery实现页面加载效果
Feb 21 Javascript
无循环 JavaScript(map、reduce、filter和find)
Apr 08 Javascript
JS获取短信验证码倒计时的实现代码
May 22 Javascript
vue watch自动检测数据变化实时渲染的方法
Jan 16 Javascript
layui-laydate时间日历控件使用方法详解
Nov 15 Javascript
Angular7创建项目、组件、服务以及服务的使用
Feb 19 Javascript
JavaScript显式数据类型转换详解
Mar 18 Javascript
vue 项目软键盘回车触发搜索事件
Sep 09 #Javascript
基于原生JS封装的Modal对话框插件的示例代码
Sep 09 #Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
Sep 09 #Javascript
JS实现斐波那契数列的五种方式(小结)
Sep 09 #Javascript
JavaScript代码简化技巧实例解析
Sep 09 #Javascript
vue 手机物理监听键+退出提示代码
Sep 09 #Javascript
关于angular引入ng-zorro的问题浅析
Sep 09 #Javascript
You might like
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
Laravel中10个有用的用法小结
2019/05/06 PHP
刷新页面实现方式总结(HTML,ASP,JS)
2008/11/13 Javascript
js 数组的for循环到底应该怎么写?
2010/05/31 Javascript
Javascript技巧之不要用for in语句对数组进行遍历
2010/10/20 Javascript
动态创建样式表在各浏览器中的差异测试代码
2011/09/13 Javascript
Jquery实现带动画效果的经典二级导航菜单
2013/03/22 Javascript
js相册效果代码(点击创建即可)
2013/04/16 Javascript
使用js检测浏览器的实现代码
2013/05/14 Javascript
jQuery.prop() 使用详解
2015/07/19 Javascript
JavaScript中日常收集常见的10种错误(推荐)
2017/01/08 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
2017/02/16 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
node.js程序作为服务并在windows下开机自启动(用forever)
2017/03/29 Javascript
微信小程序 下拉菜单简单实例
2017/04/13 Javascript
jQuery 同时获取多个标签的指定内容并储存为数组
2018/11/20 jQuery
聊聊vue 中的v-on参数问题
2021/01/29 Vue.js
[01:45]2014DOTA2 TI预选赛预选赛 大神专访第二弹!
2014/05/20 DOTA
[43:35]TI4 循环赛第二日Liquid vs Fnatic
2014/07/11 DOTA
Python中unittest用法实例
2014/09/25 Python
Python中集合类型(set)学习小结
2015/01/28 Python
在Python程序中操作MySQL的基本方法
2015/07/29 Python
Python中list初始化方法示例
2016/09/18 Python
详解python解压压缩包的五种方法
2019/07/05 Python
pytorch 求网络模型参数实例
2019/12/30 Python
Tensorflow 实现分批量读取数据
2020/01/04 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
2020/05/26 Python
微信小程序实现可实时改变转速的css3旋转动画实例代码
2018/09/11 HTML / CSS
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
视光学毕业生自荐书范文
2014/02/13 职场文书
会走路的树教学反思
2014/02/20 职场文书
揭牌仪式主持词
2014/03/19 职场文书
项目委托协议书(最新)
2014/09/13 职场文书
青年岗位能手事迹材料(2016推荐版)
2016/03/01 职场文书
车位出租协议书范本
2016/03/19 职场文书
Vue3中toRef与toRefs的区别
2022/03/24 Vue.js