事件循环是一个循环体,在循环体中有六个阶段,在每个阶段中,都有一个事件队列,不同的事件队列存储了不同类型的异步API 的回调函数。 Event Loop 的六个阶段 - 图1 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执行与关闭事件相关的回调,例如关闭数据库连接的回调函数等。

    循环体会不断运行以检测是否存在没有调用的回调函数,事件循环机制会按照先进先出的方式执行他们直到队列为空。