前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Node 事件循环究竟是如何工作的: 为何大部分的事件循环图都是错的

Node 事件循环究竟是如何工作的: 为何大部分的事件循环图都是错的

作者头像
疯狂的技术宅
发布2019-03-27 15:56:57
7690
发布2019-03-27 15:56:57
举报
文章被收录于专栏:京程一灯

当 Bert 在 2016 年欧洲 Node 交流大会上提出关于事件循环的主题时,他以一句“大部分的事件循环图都是错的”开场。我很愧疚,我演讲中也用过一些错误的图。:)

就是如此。事件循环像做热蛋糕一样在客户端循环处理数据。

他给的图非常接近真实情况。在此,事件循环开始,工作,最后退出(双关语)。

下面是图中的一些重要步骤:

  1. 运行一个脚本: node index.js
  2. 脚本中包含 setTimeout()setInterval()
  3. 一些代码在运行
  4. Unicorn 函数(稍后详细介绍)
  5. 更多代码
  6. setImmediate() 其实没有立即运行
  7. 代码
  8. 清理结束的事件
  9. 最后的代码
  10. 如果有 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 闭包



小手一抖,资料全有。长按二维码关注京程一灯,阅读更多技术文章和业界动态。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 京程一灯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档