一直以来对event loop有点模糊,看了好多大牛的文章,特写此文加强记忆。
首先需要明确的一点儿是ECMAScript中没有event loop,event loop是在HTML Standard定义的。event loop规范中定义了浏览器何时进行渲染更新,探索event loop的原理可以帮助我们更好了解一些框架模板渲染的机制,同时也可以考虑一下如何coding能最大程度的提升性能。
event loop : 事件循环,是实现异步的一种方式,在html standard 中的定义是event loop协调事件,用户交互,脚本,渲染,网络等
task: 任务, 一个事件循环有一个或者多个task队列。task可以分为两类:Macro Task (宏观)和 Micro Task(微观), 并且每个 Macro Task 结束后, 都要清空所有的 Micro Task。
html standard 没有具体指明哪些是Micro Task任务源,通常认为是microtask任务源有:process.nextTick 、promise 、Object.observe(已废弃)、MutationObserver(html5新特性)。Macrotask 包括:script(整体代码),setTimeout, setInterval, setImmediate, I/O, UI rendering
引用此文中解释如下:
下面以一个例子说明下整个过程:
setImmediate(function(){
console.log(1);
},0);
setTimeout(function(){
console.log(2);
},0);
new Promise(function(resolve){
console.log(3);
resolve();
console.log(4);
}).then(function(){
console.log(5);
});
console.log(6);
process.nextTick(function(){
console.log(7);
});
console.log(8);
个人理解过程如下(不对之处,望指正):