前段时间较为系统性的学习了node,在学习过程中发现其中的事件循环机制与浏览器中的有很大的不同,今天特意查找相关资料,整理node的事件循环机制。
1.异步API
以上三个异步操作分别对应Timer、Poll、Check队列;
2.事件循环顺序
- 自上而下依次执行,会在Poll队列暂停判断等待(查看Timer和Check是否有任务执行)
- 注意setImmediate与setTimeout,因为在node中setTimeout精度为1ms,因此即使延时设置为0,也会有1ms延时,如果反复执行下述代码,会出现不同的结果。
为保证按照指定的顺序,可以把他们放到一个I/O操作的回调中,如下图所示。此时处于Poll队列,会依次往Check队列执行,因此会先调用setImmediate;
3.process.nextTick(node特有)
在启动事件循环之前会先清空nextTick任务。事件循环中从timer到check运行一周叫一个tick,process.nextTick即是为了在一个tick之前执行的。
4.微任务队列
比如promise.then....,会在nexttick之后事件循环之前。