深入理解nodejs event loop机制
浏览器环境和nodejs环境的事件循环机制是不一样的,首先看一个demo: 在浏览器环境中运行结果如下: 在nodejs环境中运行结果如下: 上面例子说明浏览器和nodejs的时间循环是有区别的。 nodejs的事件处理 nodejs采用V8作为js的解析引擎,而I/O处理方面使用自己设计的libuv,libuv是一个基于事件驱动的跨平台抽象层,封装了不同操作系统的一些底层特性,对外提供统一API,事件循环机制也是在它里面实现的, 核心代码参考 : 根据Nodejs官方介绍,每次事件循环都包含了6个阶段,对应libuv源码中的实现,如下图: timers阶段:这个阶段执行timer(setTimeout、setInterval)的回调 I/O callbacks阶段:执行一些系统调用错误,比如网络通信的错误回调 idle,prepare阶段:仅供node内部使用 poll阶段:获取新的I/O事件,适当的条件下node将阻塞在这里 check阶段:执行setImmediate()的回调 close callbacks阶段:执行socket的close事件回调 重点看timers、poll、check这3个阶段,因为日常开发中的绝大部分异步都是在这3个阶段处理。 timers阶段 timers是事件循环的第一个阶段,node会去检查有无过期的timer