当前位置:网站首页>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
边栏推荐
- FTXUI基础笔记(hello world)
- String compression (3) short string compression
- The sword refers to OfferⅡ 045. The bottommost leftmost value of the binary tree dfs
- 从宠爱到嫌弃,蒸发1500亿后,这家明星企业为何陨落?
- shell获取前n天的日期
- LeetCode-692. Top K Frequent Words
- 阿里工作7年,肝到P8就剩这份学习笔记了,已助朋友拿到10个Offer
- 利用SparkLauncher 提交Job
- Go+:首个顺应 “三位一体” 发展潮流的编程语言
- h5开容器,新页面返回遇到的问题
猜你喜欢
随机推荐
How to generate code using the Swift Package plugin
ahx文件转mav文件 工具分享及说明
rtsp 和 rtmp 推流(一)
一文带你拿下信号卷积—常见信号卷积
I met a 25k+ from Tencent, he let me see what kind of basic ceiling
开源生态与AI芯片的碰撞&Dragonfly基于P2P的镜像加速系统 | 第 39-40 期
从抖音到火山引擎——看流媒体技术演进和机会
软件配置 | pip下载第三方库文件及配置pip源的不完全总结
异常处理的超详细讲解
LeetCode-922. Sort Array By Parity II
MS | 使用小技巧不完全总结
生成树协议(STP---Spanning Tree Protocol)
MySQL的使用演示及操作,MySQL数据字符集的设置
LeetCode-876. Middle of the Linked List
烟雾、空气质量、温湿度...自己徒手做个环境检测设备
找到一个超级神奇,百试百灵的解决 ModuleNotFoundError: No module named xxx 的方法
C专家编程 第10章 再论指针 10.8 轻松一下---程序检验的限制
蓝桥ROS之 cmake gcc g++ 默认版本和升级
解决mpi4py导入报错ImportError: libmpi.so.40: cannot open shared object file: No such file or directory
华为-坐标移动