1.
为什么要学习事件循环机制
?
学习事件循环可以让开发者明白
JavaScript
的运行机制是怎么样的。
2.
事件循环机制做的是什么事情?
事件循环机制用于管理异步
API
的回调函数什么时候回到主线程中执行。
Node.js
采用的是异步
I/O
模型。同步
API
在主线程中执行,异步
API
在底层的
C++
维护的线程中
执行,异步
API
的回调函数在主线程中执行。在
JavaScript
应用运行时,众多异步
API
的回调函数
什么时候能回到主线程中调用呢?这就是事件循环机制做的事情,管理异步
API
的回调函数什么时
候回到主线程中执行。
3.
为什么这种机制叫做事件循环?
因为
Node.js
是事件驱动的。事件驱动就是当什么时候做什么事情,做的事情就定义在回调函数
中,可以将异步
API
的回调函数理解为事件处理函数,所以管理异步
API
回调函数什么时候回到主
线程中调用的机制叫做事件循环机制。
4.10. Event Loop
的六个阶段
事件循环是一个循环体,在循环体中有六个阶段,在每个阶段中,都有一个事件队列,不同的事件队列
存储了不同类型的异步
API
的回调函数。
1. Timers
:用于存储定时器的回调函数
(setInterval, setTimeout)
。
2. Pending callbacks
:执行与操作系统相关的回调函数,比如启动服务器端应用时监听端口操作的回
调函数就在这里调用。
3. Idle, prepare
:系统内部使用。
4. IO Poll
:存储
I/O
操作的回调函数队列,比如文件读写操作的回调函数。
如果事件队列中有回调函数,执行它们直到清空队列。
否则事件循环将在此阶段停留一段时间以等待新的回调函数进入,这个等待取决于以下两个条件:
1. setImmediate
队列
(check
阶段
)
中存在要执行的回调函数
.
2. timers
队列中存在要执行的回调函数
.
在这种情况下
,
事件循环将移至
check
阶段
,
然后移至
Closing callbacks
阶段
,
并最终从
timers
阶段进入下一次循环。
5. Check
:存储
setImmediate API
的回调函数。
6. Closing callbacks
:执行与关闭事件相关的回调,例如关闭数据库连接的回调函数等。
循环体会不断运行以检测是否存在没有调用的回调函数,事件循环机制会按照先进先出的方式执行他们
直到队列为空。