博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Promise事件比timeout优先
阅读量:7015 次
发布时间:2019-06-28

本文共 745 字,大约阅读时间需要 2 分钟。

Promise, setTimeout 和 Event Loop

下面的代码段,为什么输出结果是1,2,3,5,4而非1,2,3,4,5?

(function test() {
setTimeout(function() {console.log(4)}, 0);
new Promise(function executor(resolve) {
console.log(1);
for( var i=0 ; i<10000 ; i++ ) {
i == 9999 && resolve();
}
console.log(2);
}).then(function() {
console.log(5);
});
console.log(3);
})()

因为event loop中有多个task 队列,到底有多少个,每个浏览器的实现不同, 其中micro-task队列存放高优先级的任务, macro-task队列存放普通优先级的任务。
* setTimeout 给macro-task队列中添加了一个任务4。
* 创建Promise实例(executor)是同步执行的, 它直接输出1和2
* Promise.then是异步执行的。 其中的resolve, 只是把then的任务,i.e.任务5, 添加micro-task队列中。
* micro-task队列具有高优先级, 所以, 在3之后, 先执行micro-task中的任务5
* 然后是低优先级的macro-task队列中的任务4

 

https://github.com/creeperyang/blog/issues/21

转载于:https://www.cnblogs.com/GameEngine/p/7158501.html

你可能感兴趣的文章
NeHe OpenGL教程 第十七课:2D图像文字
查看>>
学习SpringMVC——从HelloWorld开始
查看>>
awk打印指定列以后的所有内容
查看>>
用 kGDB 调试 Linux 内核
查看>>
vuejs2.0子组件改变父组件的数据
查看>>
P1019 单词接龙
查看>>
git的版本回退探索
查看>>
H3c 配置ssh acl
查看>>
Dedecms判断当前栏目下是否有子栏目
查看>>
【PIC学习第2例】PIC16F877A LED闪烁
查看>>
SQL2005中时,Diagrams的问题
查看>>
拨云见日,任重道远 ——第六届云计算大会感悟
查看>>
CentOS VMware 下SSH配置方法详解
查看>>
PHP错误级别 error_reporting() 函数详解
查看>>
WIndows 使用VS编译 Lua5
查看>>
什么是“单播”“组播”和“多播”
查看>>
flex---->图表控件
查看>>
分析函数调用关系图(call graph)的几种方法
查看>>
11.0592M晶振与12M晶振
查看>>
A380上11万一张的机票什么享受?来看看
查看>>