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 相关文章推荐
漂亮的widgets,支持换肤和后期开发新皮肤(2007-4-27已更新1.7alpha)
Apr 27 Javascript
使用phantomjs进行网页抓取的实现代码
Sep 29 Javascript
node.js回调函数之阻塞调用与非阻塞调用
Nov 13 Javascript
EasyUI Pagination 分页的两种做法小结
Jul 09 Javascript
有关文件上传 非ajax提交 得到后台数据问题
Oct 12 Javascript
简单理解js的prototype属性及使用
Dec 07 Javascript
jQuery validate插件功能与用法详解
Dec 15 Javascript
layui选项卡效果实现代码
May 19 Javascript
Vue v2.4中新增的$attrs及$listeners属性使用教程
Jan 08 Javascript
使用vue.js在页面内组件监听scroll事件的方法
Sep 11 Javascript
vue项目使用微信公众号支付总结及遇到的坑
Oct 23 Javascript
Servlet返回的数据js解析2种方法
Dec 12 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
PHP新手上路(四)
2006/10/09 PHP
php实现jQuery扩展函数
2009/10/30 PHP
PHP页面中文乱码分析
2013/10/29 PHP
ThinkPHP CURD方法之data方法详解
2014/06/18 PHP
PHP输入流php://input实例讲解
2015/12/22 PHP
php7 新增功能实例总结
2020/05/25 PHP
JavaScript实现统计文本框Textarea字数增强用户体验
2012/12/21 Javascript
JS,Jquery获取select,dropdownlist,checkbox下拉列表框的值(示例代码)
2014/01/11 Javascript
JavaScript支持的最大递归调用次数分析
2014/06/24 Javascript
轻松掌握jQuery中wrap()与unwrap()函数的用法
2016/05/24 Javascript
纯JS实现表单验证实例
2016/12/24 Javascript
Node.js与Sails redis组件的使用教程
2017/02/14 Javascript
原生javascript实现读写CSS样式的方法详解
2017/02/20 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
Vue代码分割懒加载的实现方法
2017/11/23 Javascript
Vue中自定义全局组件的实现方法
2017/12/08 Javascript
vue中实现methods一个方法调用另外一个方法
2018/02/08 Javascript
Vue三种常用传值示例(父传子、子传父、非父子)
2018/07/24 Javascript
javaScript实现游戏倒计时功能
2018/11/17 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
[00:32]2018DOTA2亚洲邀请赛OpTic出场
2018/04/03 DOTA
整理Python最基本的操作字典的方法
2015/04/24 Python
python操作字典类型的常用方法(推荐)
2016/05/16 Python
python3.6+opencv3.4实现鼠标交互查看图片像素
2018/02/26 Python
Python使用Flask-SQLAlchemy连接数据库操作示例
2018/08/31 Python
记一次python 内存泄漏问题及解决过程
2018/11/29 Python
Python可迭代对象操作示例
2019/05/07 Python
pytorch 实现L2和L1正则化regularization的操作
2021/03/03 Python
HTML5 canvas基本绘图之图形组合
2016/06/27 HTML / CSS
GWT的应用有哪两种部署模式
2012/12/21 面试题
《湘夫人》教学反思
2014/02/21 职场文书
社团活动总结格式
2014/08/29 职场文书
党员个人批评与自我批评
2014/10/14 职场文书
优秀护士事迹材料
2014/12/25 职场文书
Mysql排查分析慢sql之explain实战案例
2022/04/19 MySQL
Python OpenGL基本配置方式
2022/05/20 Python