当 Bert 在 2016 年欧洲 Node 交流大会上提出关于事件循环的主题时,他以一句“大部分的事件循环图都是错的”开场。我很愧疚,我演讲中也用过一些错误的图。:)
就是如此。事件循环像做热蛋糕一样在客户端循环处理数据。
他给的图非常接近真实情况。在此,事件循环开始,工作,最后退出(双关语)。
下面是图中的一些重要步骤:
node index.js
setTimeout()
和 setInterval()
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。
往期精选文章 |
---|
使用虚拟dom和JavaScript构建完全响应式的UI框架 |
扩展 Vue 组件 |
使用Three.js制作酷炫无比的无穷隧道特效 |
一个治愈JavaScript疲劳的学习计划 |
全栈工程师技能大全 |
WEB前端性能优化常见方法 |
一小时内搭建一个全栈Web应用框架 |
干货:CSS 专业技巧 |
四步实现React页面过渡动画效果 |
让你分分钟理解 JavaScript 闭包 |
小手一抖,资料全有。长按二维码关注京程一灯,阅读更多技术文章和业界动态。