译者:萧暮
当 Bert 在 2016 年欧洲 Node 交流大会上提出关于事件循环的主题时,他以一句“大部分的事件循环图都是错的”开场。我很愧疚,我演讲中也用过一些错误的图。:)
就是如此。事件循环像做热蛋糕一样在客户端循环处理数据。
他给的图非常接近真实情况。在此,事件循环开始,工作,最后退出(双关语)。
下面是图中的一些重要步骤:
-
运行一个脚本:
node index.js
-
脚本中包含
setTimeout()
和setInterval()
-
一些代码在运行
-
Unicorn 函数(稍后详细介绍)
-
更多代码
-
setImmediate()
其实没有立即运行 -
代码
-
清理结束的事件
-
最后的代码
-
如果有
refs
回到第 2 步,没有则进程退出
Refs 是一个简单的计数器,当有一个异步回调将要执行时增加,当它最后执行结束时减少。如果是流式回调(比如监听 data),那么只会有一个引用增加。
每段 JS 代码块都有它自己的 process.nextTick()
:
是的。nextTick()
事实上是立即执行,而 setImmediate()
则是在下一个时钟(tick)运行。啊。把它们记成跟方法名相反的吧。换句话说,如果你有一堆嵌套的 nextTick()
回调,你的代码会直接在 JS 块中运行,永远不会到下一个事件循环(步骤 2-9).
最后来说说 unicorn 函数。它像一个 Node 和操作系统的通信器。如你所知,操作系统及其进程都是异步的,但他们看起来却是同步的。unicorn 利用异步性质并为 Node 的事件循环所用。加一句,unicorns 很酷:
顺便说一句,尽管如图所述,线程池不能处理网络请求或 TCP 套接字。后者发生在内核中。
要掀桌子了(Table flip)?确实。但好消息是 Node 主要用来进行构建一个 Express 服务器或者运行一个 Gulp 任务之类的工作,而不必了解事件循环究竟是怎么工作的!
非常感谢 Bert。这是我在 2016 年欧洲 Node 交流大会上最喜爱的演讲之一。现在我要去重画我的图表,更准确地描述事件循环在 Node 中实际是如何工作的。:) 这个怎么样?
旁注:如果你喜欢这篇文章,并且对企业现场培训 JavaScript,Node.js 和 React.js 以提高团队生产力感兴趣,请联系 NodeProgram.com。