EventEmitter hiện thực pattern Observer/pub-sub và là xương sống bên trong Node.js — streams, http.Server, process đều kế thừa nó.
.on('event', listener)đăng ký listener thường trực..once('event', listener)tự gỡ sau lần emit đầu tiên..emit('event', ...args)gọi đồng bộ toàn bộ listener..off('event', listener)(hay.removeListener()) để huỷ đăng ký.
js
class OrderService extends EventEmitter {
async createOrder(data) {
const order = await db.save(data)
this.emit('order:created', order)
}
}Các service khác lắng nghe order:created thay vì gọi chéo nhau, nên không bị coupling trực tiếp. .once() hợp cho việc thiết lập một lần: server.once('listening', () => console.log('ready')).
- Node.js cảnh báo
MaxListenersExceededWarningkhi một event có hơn 10 listener — cố ý thìemitter.setMaxListeners(20), còn không thì đi tìm chỗ rò. Nguyên nhân hay gặp là quên.removeListener()lúc cleanup nên listener cứ chồng lên. - Event tên
'error'là trường hợp đặc biệt: emit'error'mà không có listener sẽ throw uncaughtException và làm sập process.
Lưu ý: EventEmitter không await listener bất đồng bộ — promise không bắt lỗi trong listener sẽ lỗi âm thầm, không ai hay.