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将文本转化成JSON对象需要注意的问题
May 09 Javascript
使用delegate方法为一个tr标签加一个链接
Jun 27 Javascript
jQuery根据用户电脑是mac还是pc加载对应样式的方法
Jun 26 Javascript
基于JavaScript实现TAB标签效果
Jan 12 Javascript
angularjs封装bootstrap时间插件datetimepicker
Jun 20 Javascript
js从输入框读取内容,比较两个数字的大小方法
Mar 13 Javascript
说说AngularJS中的$parse和$eval的用法
Sep 14 Javascript
用图片替换checkbox原始样式并实现同样的功能
Nov 15 Javascript
JS使用对象的defineProperty进行变量监控操作示例
Feb 02 Javascript
setTimeout与setInterval的区别浅析
Mar 23 Javascript
小程序分享链接onShareAppMessage的具体用法
May 22 Javascript
echarts实现获取datazoom的起始值(包括x轴和y轴)
Jul 20 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+jquery编码方面的一些心得(utf-8 gb2312)
2010/10/12 PHP
php中sprintf与printf函数用法区别解析
2014/02/17 PHP
php中替换字符串中的空格为逗号','的方法
2014/06/09 PHP
ThinkPHP模板自定义标签使用方法
2014/06/26 PHP
PHP命名空间(namespace)的使用基础及示例
2014/08/18 PHP
PHP常见字符串处理函数用法示例【转换,转义,截取,比较,查找,反转,切割】
2016/12/24 PHP
Laravel 5.4因特殊字段太长导致migrations报错的解决
2017/10/22 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
在JavaScript中实现命名空间
2006/11/23 Javascript
JSON 编辑器实现代码
2009/12/06 Javascript
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
jQuery 无刷新分页实例代码
2013/11/12 Javascript
JQuery EasyUI 加载两次url的原因分析及解决方案
2014/08/18 Javascript
jQuery 浮动导航菜单适合购物商品类型的网站
2014/09/09 Javascript
jQuery点击输入框显示验证码图片
2016/05/19 Javascript
jQuery的ajax下载blob文件
2016/07/21 Javascript
jquery仿微信聊天界面
2017/05/06 jQuery
SeaJS中use函数用法实例分析
2017/10/10 Javascript
node使用Koa2搭建web项目的方法
2017/10/17 Javascript
JS将网址url转化为JSON格式的方法
2018/07/02 Javascript
BootStrap表单验证中的非Submit类型按钮点击时触发验证的坑
2019/09/05 Javascript
JS代码简洁方式之函数方法详解
2020/07/28 Javascript
typescript配置alias的详细步骤
2020/08/12 Javascript
Django实现单用户登录的方法示例
2019/03/28 Python
解释i节点在文件系统中的作用
2013/11/26 面试题
婚前财产公证书
2014/04/10 职场文书
平安工地建设方案
2014/05/06 职场文书
最新优秀教师个人先进事迹材料
2014/05/06 职场文书
婚礼证婚人演讲稿
2014/09/13 职场文书
2014年会计主管工作总结
2014/12/20 职场文书
酒店工程部经理岗位职责
2015/04/09 职场文书
离婚撤诉申请书范本
2015/05/18 职场文书
2015年网管个人工作总结
2015/05/22 职场文书
在职证明书模板
2015/06/15 职场文书
Python MNIST手写体识别详解与试练
2021/11/07 Python
PHP正则表达式之RCEService回溯
2022/04/11 PHP