Node.js 採用事件驅動架構,EventEmitter 是核心模塊,支撐起整個異步非阻塞生態。本文從基本用法、異步觸發機制、類繼承擴展三個維度全面解析事件驅動編程。
const EventEmitter = require('events').EventEmitter;
const emitter = new EventEmitter();
// 綁定事件監聽器
emitter.on('eventName', eventHandler);
// 觸發事件
emitter.emit('eventName', arg1, arg2);
on 等同於 addListener,支持多個監聽器;once 僅執行一次;removeListener/removeAllListeners 用於移除。
var EventEmitter = require('events').EventEmitter;
var a = new EventEmitter();
a.on('myevent', function () {
console.log('event called......');
});
process.nextTick(function () {
a.emit('myevent'); // 下一個事件循環觸發
});
console.log('oooooooo'); // 先輸出 oooooooo,再輸出 event called......
關鍵點:process.nextTick 將回調放入微任務隊列,在當前操作結束、下一個宏任務開始前執行,保證異步觸發行為。
通過原型鏈繼承 EventEmitter.prototype:
// Test.js
var EventEmitter = require('events').EventEmitter;
var MyClass = function () { /* 初始化 */ };
MyClass.prototype.__proto__ = EventEmitter.prototype; // 繼承事件能力
module.exports = MyClass;
// app.js
var MyClass = require('./Test');
var aa = new MyClass();
aa.on('fsfdfs', function(){ console.log('custom event'); });
aa.emit('fsfdfs');
現代寫法建議使用 Object.setPrototypeOf 或 ES6 class MyClass extends EventEmitter,更符合規範且可讀性更強。
emit 同步調用所有監聽器,異常會中斷後續監聽器error 事件會拋出異常,導致進程崩潰,務必監聽 errorsetMaxListeners(n) 調整事件驅動是 Node.js 的靈魂。掌握 EventEmitter 不僅能理解框架底層原理,更能編寫高解耦、可擴展的異步代碼。實際開發中結合 Promise/async-await 使用,能構建更優雅的控制流。