EventEmitter implement Observer/pub-sub pattern — backbone của Node.js internals (streams, http.Server, process đều extend EventEmitter).
- API cơ bản:
.on('event', listener)đăng ký persistent listener,.once('event', listener)tự remove sau lần emit đầu tiên,.emit('event', ...args)kích hoạt đồng bộ tất cả listeners,.off('event', listener)hoặc.removeListener()để unsubscribe. - Memory leak warning: Node.js warn khi > 10 listeners trên cùng event (
MaxListenersExceededWarning) — dùngemitter.setMaxListeners(20)nếu cố ý, hoặc fix leak. - Thường quên
.removeListener()trong component unmount/cleanup → listeners tích lũy. - Error convention: event tên
'error'đặc biệt — nếu emit'error'mà không có listener thì throw uncaughtException crash process. - Practical patterns:
class OrderService extends EventEmitter { async createOrder(data) { const order = await db.save(data); this.emit('order:created', order); } }— services khác lắng nghe event thay vì coupling trực tiếp..once()dùng cho one-time setup:server.once('listening', () => console.log('ready')). - Async listeners: EventEmitter không await async listeners — unhandled promise trong listener → silent failure.