什么是Event Loop?
event loop是一个执行模型,在不同的地方有不同的实现。浏览器和NodeJS基于不同的技术实现了各自的Event Loop。
为什么要有Event Loop?
因为JavaScript 是单线程的,有了 event loop 的加持,Node.js 和浏览器才可以非阻塞地执行相应操作。
Node.js的Event Loop
Node.js的Event Loop分为六个阶段,在此简化为三个阶段:timers、poll、check。每一个阶段都有一个相应的任务队列,并且这三个阶段形成一个环:timers->poll->check->timers
这三个阶段,poll阶段用于执行对应i/o操作的回调,本文仅讨论当poll队列为空的情况。
讨论以下情况
1.当代码出现setTimeout()
将setTimeout()
中的回调放入timers的任务队列中(setInterval()
也同理)
2.当代码出现setImmediate()
将setImmediate()
中的回调放入check的任务队列中
3.process.nextTick()
中的回调不属于这三个阶段中任意一个,我们将其放在当前阶段的后面,在当前阶段的任务队列被清空后,就执行process.nextTick()
由于setTimeout()
回调最短的执行事件也需要4ms(即使第二个参数传入0ms也会被当作4ms),所以一般第一个循环的timers阶段不会有任何回调被执行
浏览器的Event Loop
浏览器的事件循环分为两个阶段:宏任务(marco),微任务(micro),两个阶段构成循环。
讨论以下情况
-
setTimeout()
中的回调归为宏任务(setInterval
同理) -
promise.then()
中的回调归为微任务 - 在
async function
中的await
之后的代码可以被看做promise.then()
中的回调,也归为微任务
微任务的任务队列不被执行完之前不会进入下个循环,宏任务的任务队列执行多少个任务取决于你在setTimeout
中设置的第二个参数,时间已经到了或超时,到了宏任务阶段就被执行掉, 如果没有到时间或超时,即使进入宏任务阶段该任务也不会被执行
网友评论