简介
node中的js也是单线程的,所以为了实现非阻塞,它需要和浏览器同样实现一个事件循环机制。
最新版本的node执行和浏览器表现行为是一致的。
node中底层libuv库 实现了一套事件环机制。
node中的宏任务和微任务
由于node没有dom对象,所以没有MutationObserver对象,所以node中的微任务只有promise。在微任务队列之前,还有一个队列:nextTick队列。
node中的宏任务分为:
- 消息队列Timer
- poll队列(I/O操作)
- check队列(setImmediate)
node中的事件循环
- 进程执行的时候 会先执行同步代码
- 同步代码执行完毕后执行nextTick队列 [nextTick,nextTick]
- 清空微任务队列
-------每取一个宏任务都会清空微任务------- - 清空微任务后会看定时器队列中是否有完成的, 有的话拿出来依次执行 (如果没有定时器,直接走到poll阶段)
- 定时器任务完成后,会走到poll阶段里,里面包含一些i/o 操作的回调,同样依次执行
- poll清空后会查找check阶段中是否有回调,有的话会优先执行,执行完毕后,按照上述流程回到poll阶段中
- 如果check阶段中没有任务 就会再poll阶段中阻塞,等待定时器到达时间后再次执行 , 如果什么都没有了进程结束了
PS:本人也是初学,如有不对请指正