当前位置:网站首页>promise笔记(四)
promise笔记(四)
2022-08-10 16:31:00 【hlz2516】
宏队列与微队列
当js程序执行到异步代码(如定时器,ajax请求等)时,会把异步回调函数放入到队列中,等到同步代码全部执行完后再从队列里取出函数执行。实际上,js有两个队列,分别是宏队列与微队列,宏队列专门放与定时器相关的异步回调,ajax回调,dom事件回调;微队列专门放promise回调和mutation observer回调,关于mutation observer我们现在不用了解,因为这个东西用的很少,所以只需要记住promise是放到微队列就行了。
按照尚硅谷教程的说法,对于异步回调处理流程是这样的:
1. js引擎首先必须先执行所有的初始化同步任务代码
2. 每次准备从宏队列取出一个任务执行前,都要先将所有的微任务一个个取出来执行
为了验证上述流程,我们写一段代码:
Promise.resolve(123).then((value)=>{
console.log('resolved 1',value);
})
setTimeout(() => {
Promise.resolve(456).then((value)=>{
console.log('resolved 2',value);
})
}, 1);
Promise.resolve(789).then((value)=>{
console.log('resolved 3',value);
})
setTimeout(() => {
console.log('setTimeout');
}, 1);
分析:
在执行同步代码的过程中,先把第一个值为123的promise放入微队列,再把第一个setTimeout放入宏队列,再把值为789的promise放入微队列,最后把第二个setTimeout放入宏队列。
接下来,先检查一遍微队列里有无待执行函数,发现有,于是取出那个值为123的promise成功回调函数并执行;此时微队列不为空,那么继续取出,789的那个promise成功回调函数执行;此时微队列为空,可以取宏队列了,于是从宏队列取出第一个setTimeout执行,发现有promise,于是把promise放入微队列,执行完毕;此时再检查微队列,发现有新的Promise于是取出执行那个456的回调;之后检查微队列为空,于是回到宏队列取出第二个setTimeout,打印输出;检查宏队列为空,程序结束。
结果:
resolved 1 123
resolved 3 789
resolved 2 456
setTimeout
边栏推荐
- The sword refers to OfferⅡ 045. The bottommost leftmost value of the binary tree dfs
- Knox 代理各类组件
- 剑指OfferⅡ 045.二叉树最底层最左边的值 dfs
- String compression (3) short string compression
- FTXUI基础笔记(botton按钮组件基础)
- Andorid源码编译需要掌握的shell语法(三)
- 困扰已久的一个微信bug
- 利用SparkLauncher 提交Job
- 8月Meetup | “数据调度+分析引擎”解锁企业数字化转型之路
- 如何使用Swift Package插件生成代码
猜你喜欢
随机推荐
kuangbin专题一 简单搜索
玩转Redis|学会这10点让你分分钟拿下Redis,满足你的一切疑问
mysql按月查询统计(统计近12个月的项目个数)
家电巨头,不碰儿童生意
轮询以及webSocket与socket.io原理
cmake record
视频转成gif动图怎么操作?仅需三步在线完成视频转gif
一文带你拿下信号卷积—常见信号卷积
【FreeRTOS】13 动态内存管理
How to use bitwise operators in C language
观测云入选 CNCF 云原生全景图
超宽带uwb精准定位,厘米级室内定位技术,实时高精度方案应用
v-on补充:自定义参数传递和事件修饰符
如何修改gif图片尺寸?教你一键裁剪gif尺寸
【Windows】将排除项添加到安全中心以避免exe被系统自动删除
shell获取前n天的日期
积分可以当钱用,阿里推出个人「碳账户」
面了个腾讯25k+出来的,他让我见识到什么基础的天花板
Bitwarden:免费、开源的密码管理服务
商业智能BI行业分析思维框架:铅酸蓄电池行业(二)