Node.js & TypeScript: Sự kiện và EventEmitter

Giới thiệu
Trong bài viết này, chúng ta sẽ tìm hiểu về cách sử dụng EventEmitter
trong Node.js với TypeScript. Đây là một phần quan trọng giúp bạn xây dựng các ứng dụng bất đồng bộ và hướng sự kiện.
EventEmitter là gì?
EventEmitter
là một lớp cốt lõi của Node.js, cho phép chúng ta tạo và xử lý các sự kiện tùy chỉnh. Bạn có thể phát ra sự kiện (emit
) và lắng nghe nó (on
).
Ví dụ đơn giản:
import { EventEmitter } from 'events';
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {
console.log('Sự kiện đã xảy ra!');
});
myEmitter.emit('event'); // Output: Sự kiện đã xảy ra!
Định nghĩa các loại sự kiện với TypeScript
Bạn có thể tạo lớp kế thừa EventEmitter
để xác định rõ các loại sự kiện:
import { EventEmitter } from 'events';
interface MyEvents {
'orderCreated': (orderId: number) => void;
'orderCancelled': (orderId: number) => void;
}
class TypedEmitter extends EventEmitter {
on<K extends keyof MyEvents>(eventName: K, listener: MyEvents[K]): this {
return super.on(eventName, listener);
}
emit<K extends keyof MyEvents>(eventName: K, ...args: Parameters<MyEvents[K]>): boolean {
return super.emit(eventName, ...args);
}
}
Sử dụng:
const emitter = new TypedEmitter();
emitter.on('orderCreated', (id) => {
console.log(`Đơn hàng ${id} đã được tạo.`);
});
emitter.emit('orderCreated', 101);
Loại bỏ sự kiện với off
hoặc removeListener
Để gỡ bỏ một listener, bạn có thể dùng off
:
function listener() {
console.log('Đã xử lý');
}
emitter.on('event', listener);
emitter.off('event', listener);
Một số phương thức hữu ích khác
once
: Lắng nghe một sự kiện chỉ một lầnremoveAllListeners
: Gỡ bỏ toàn bộ listenereventNames()
: Trả về danh sách tên các sự kiện hiện cólistenerCount(eventName)
: Đếm số lượng listener
Kết luận
EventEmitter
là một phần quan trọng của Node.js để xây dựng các ứng dụng theo hướng sự kiện- Với TypeScript, bạn có thể tạo các lớp
TypedEmitter
để đảm bảo kiểu dữ liệu an toàn - Các phương thức như
on
,emit
,once
,off
,removeAllListeners
giúp bạn kiểm soát tốt hơn việc xử lý sự kiện
Comments ()