当前位置:网站首页>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
边栏推荐
猜你喜欢

Etcd Kubernetes 集群稳定性:LIST 请求源码分析、性能评估与大规模基础服务部署调优

面了个腾讯25k+出来的,他让我见识到什么基础的天花板

从宠爱到嫌弃,蒸发1500亿后,这家明星企业为何陨落?

mysql按月查询统计(统计近12个月的项目个数)

#夏日挑战赛#【ELT.ZIP】啃论文俱乐部——学术科研方法论沉淀辑

如何将jpg图片变成gif?教你一分钟图片合成gif的方法

【JDK】Oracle又一个JDK大版本停止扩展技术支持

积分可以当钱用,阿里推出个人「碳账户」

视频转gif怎样操作?1分钟在线视频转gif制作

年薪60万+?这份10万字的面试突击宝典涵盖阿里 P5 工程师~P7 所有技术栈
随机推荐
视频转成gif动图怎么操作?仅需三步在线完成视频转gif
LeetCode-876. Middle of the Linked List
国内油价四连跌,但下跌趋势可能终止
字符串压缩(三)之短字符串压缩
【QT VS项目名称修改】
8月Meetup | “数据调度+分析引擎”解锁企业数字化转型之路
LeetCode-922. Sort Array By Parity II
生成树协议(STP---Spanning Tree Protocol)
String compression (3) short string compression
How to generate code using the Swift Package plugin
v-model指令:获取和设置表单元素的值
glui.h无法找到描述+解决+测试
怎么截取视频做gif动图?手把手教你视频在线转gif制作
JWT 实现登录认证 + Token 自动续期方案
cmake记录
shell之正则表达式及三剑客awk命令
Meaning of CDF graph
视频转gif怎样操作?1分钟在线视频转gif制作
Kubernetes kube-proxy工作原理
怎么设计产品手册?用什么设计产品手册?