Skip to the content.

事件循环 && 并发模型

Q: 事件机制是怎样的?

Q: 怎样的事件是可以阻塞后续代码继续运行的?

Q: 回调函数在逻辑上是怎么实现代码异步执行的?

JavaScript运行时

Q: JS运行时指的是什么? A: JS引擎 + 附加API.

Node.js即是JS运行时, 包含有V8引擎, 并提供系列服务器端API.

浏览器也是JS运行时, 包含有对应的JS引擎, 并提供Web API(DOM, XMLHTTPRequest, Timer等).

JS引擎提供以下这些语义概念的优化实现, 其中就包含有

事件循环时, 而JS运行时从消息队列的先进入队列消息开始处理, 这个消息被移出队列,并作为输入参数调用与之有关的函数. 函数调用即会创造新的栈帧.

事件循环

while (queue.waitForMessage()) {
  queue.processNextMessage();
}

事件循环阶段

graph TD
incoming:data,etc.外部输入数据-->轮询阶段(poll)
轮询阶段(poll)-->检查阶段(check)
检查阶段(check)-->关闭事件回调阶段(close callbacks)
关闭事件回调阶段(close callbacks)-->定时器检测阶段(timer)
定时器检测阶段(timer)-->I/O事件回调阶段(I/O callbacks)
I/O事件回调阶段(I/O callbacks)-->闲置阶段(idle, prepare)
闲置阶段(idle, prepare)-->轮询阶段(poll)

macrotask & microtask