专栏首页京程一灯Node 事件循环究竟是如何工作的: 为何大部分的事件循环图都是错的

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

当 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 闭包



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

本文分享自微信公众号 - 京程一灯(jingchengyideng)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-09-27

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Node.js 究竟是什么?

    Node.js 是一个 JavaScript 运行时环境。听起来还不错,不过这究竟意味着什么?它又是如何运作的?

    疯狂的技术宅
  • JS 和 Node.js 中的“事件驱动”是什么意思?[每日前端夜话0x106]

    事件驱动架构是建立在软件开发中一种通用模式上的,这种模式被称为发布-订阅或观察者模式。

    疯狂的技术宅
  • Node.js 事件循环完整指南[每日前端夜话0x9F]

    Complete Guide To The Event Loop In Node.js

    疯狂的技术宅
  • Node.js 是什么?我为什么选择它?

    当我们学习一项新的事物的时候,我们首先要知道它来自哪里?它是什么?能做什么或者换句话说,能解决什么问题?没有一样东西是最好的,是可以替代所有的,但在某一领域它是...

    五月君
  • Node.js 究竟是什么?

    Node.js 是一个 JavaScript 运行时环境。听起来还不错,不过这究竟意味着什么?它又是如何运作的?

    疯狂的技术宅
  • 重要文章分类目录

    《深入浅出Node.js》:Node异步编程解决方案 之 生成器(Generator)函数

    前端_AWhile
  • 13事件

    IE8中提供的事件监听器为:element.attachEvent(eventName,functionName)

    Dreamy.TZK
  • 缔安科技:行走在边缘的SD-WAN

    第二届中国SD-WAN峰会于11月16日在北京盛大开幕,来自上海缔安科技的赵苏宁先生为大家分享了主题为《行走在边缘的SD-WAN》的演讲。

    SDNLAB
  • 谈谈React事件机制和未来(react-events)

    当我们在组件上设置事件处理器时,React并不会在该DOM元素上直接绑定事件处理器. React内部自定义了一套事件系统,在这个系统上统一进行事件订阅和分发.

    _sx_
  • 配置Sublime Text工具运行JavaScript代码

        SublimeText是一款及强大的跨平台编辑器,其丰富的插件可以帮助开发者编写各种语言的代码。并且其自带控制台,开发者实现简单的配置即可在Sublim...

    珲少

扫码关注云+社区

领取腾讯云代金券