CodeRoadMap
首页路线题库资源库文章社区
CodeRoadMap

程序员的学习成长路线图。内容免费开放,登录后可同步路线图与课时进度。

由 程序员柏风 独立维护 · 关于作者

学习

  • 路线图
  • 课程
  • 面试题
  • 文章
  • 我

更多

  • 资源
  • 社区
  • 关于作者
  • 内容说明

© 2026 CodeRoadMap

津ICP备2026012044号-1·津公网安备12011002026155号·coderoadmap@126.com
Node.js 进阶/课时/EventEmitter
RawBlame
课时目录12 节

Node.js 进阶

  1. 01Node 进阶概览
  2. 02EventEmitter
  3. 03错误类型与处理
  4. 04语义化版本
  5. 05创建与发布包
  6. 06命令行应用
  7. 07Inquirer 与 prompts
  8. 08chokidar 与热重载
  9. 09模板引擎
  10. 10Node 与数据库
  11. 11glob 与文件模式
  12. 12综合练习

EventEmitter

event-emitter;发布订阅模式。

30 分钟

EventEmitter

Node 许多内置模块(http、fs、stream)继承 EventEmitter:对象在状态变化时 emit 事件,监听方 on / once 订阅。理解它,才能读懂流、服务器与自定义插件的生命周期。

学习目标

  • 使用 EventEmitter 实现发布订阅
  • 区分 on、once、off 与内存泄漏风险
  • 与 node-async Event Loop 建立联系

基本用法

import { EventEmitter } from "node:events";

const bus = new EventEmitter();

bus.on("data", (chunk) => console.log("got", chunk));
bus.emit("data", "hello");
bus.emit("data", "world");

约定:事件名用 小写 + 冒号命名空间(如 job:complete),避免与内置事件冲突。

发布订阅 vs 回调

模式适用注意
单次回调请求-响应嵌套深时 callback hell
Promise/async单次异步结果多源事件合并仍麻烦
EventEmitter多监听、长生命周期记得 off,防泄漏

Express 的 app.listen 回调是一次性的;HTTP Server 的 'request' 则是典型 长期订阅——与 Spring 的 ApplicationEventPublisher 类似,但 API 更轻。

继承与错误事件

import { EventEmitter } from "node:events";

class JobQueue extends EventEmitter {
  enqueue(job) {
    setImmediate(() => {
      try {
        this.emit("progress", job.id, 50);
        this.emit("done", job.id);
      } catch (err) {
        this.emit("error", err);
      }
    });
  }
}

规则:若监听了 'error' 却无人处理,Node 会 抛出未捕获异常——生产代码要么处理,要么文档写明由调用方订阅。

与 Streams、HTTP 的关系

  • node-streams:readable.on('data') 即 EventEmitter
  • node-http:server.on('request', handler)

Nest 的 @nestjs/event-emitter 在框架层封装类似模式,见 nestjs-essentials 进阶阅读;本课保持 直觉。

原生 API

练习

  • 写一个 DownloadTracker:emit progress(percent) 与 finish(path)
  • 用 once 保证 finish 只触发一次清理
  • 阅读 node-errors,对比 'error' 事件与 try/catch

小结

emit 通知、on 订阅、error 必须有人接。 下一课系统梳理 Node 错误类型与处理策略。

加载本节练习…
← 上一课Node 进阶概览下一课 →错误类型与处理