EventEmitter 是 Node 的核心类,实现了 publish/subscribe 模式:对象发出命名事件,为这些事件注册的监听器在事件触发时运行。Node 自身的大部分 API(streams、HTTP servers、process)都建立在它之上。
基本用法
js
{ } ;
emitter = ();
emitter.(, {
.();
});
emitter.(, { : });
模式:on(event, listener) 订阅;emit(event, ...args) 同步触发该事件的所有监听器,传递参数。
class OrderService extends EventEmitter {
placeOrder(order) {
// ...save the order...
this.emit("order:created", order); // notify anyone interested
}
}
const service = new OrderService();
service.on("order:created", (o) => sendEmail(o)); // decoupled listeners
service.on("order:created", (o) => updateAnalytics(o));
service.placeOrder({ id: 1 }); // both listeners run
这将发射器与其监听器解耦——OrderService 不知道或不关心谁在监听,因此你可以在不修改它的情况下添加反应(邮件、分析、日志记录)。
emitter.once("ready", fn); // listener runs only ONCE, then auto-removes
emitter.off("order", fn); // remove a listener (prevent leaks)
emitter.emit("error", new Error()); // "error" is special — throws if no listener!
emitter.listenerCount("order");
⚠️ Memory leaks: forgetting to remove listeners (use off/once). Node warns at >10
listeners on one event ("possible EventEmitter memory leak").
⚠️ The "error" event: if emitted with no listener, Node THROWS and may crash —
always attach an error listener to emitters that can error (streams!).
streams (data, end, error events), http.Server (request event),
process (SIGTERM, exit), sockets — all are EventEmitters.
EventEmitter 是 Node 事件驱动架构的基础——理解它可以解释 streams、servers 和 process 对象如何工作(它们都是发射器),并且它是你自己代码中解耦、事件驱动通信的标准工具。
了解 on/emit/once/off API、未移除监听器导致的内存泄漏风险,以及特殊的导致崩溃的 error 事件对于正确使用 Node 的 API 和构建可维护的事件驱动系统至关重要。