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

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ần
  • removeAllListeners: Gỡ bỏ toàn bộ listener
  • eventNames(): 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