Node.js là một nền tảng phát triển ứng dụng web dựa trên JavaScript, sử dụng kiến trúc hướng sự kiện không đồng bộ. Điều này có nghĩa là Node.js có thể xử lý nhiều yêu cầu đồng thời mà không cần chờ đợi kết quả của mỗi yêu cầu. Để làm được điều đó, Node.js sử dụng một đối tượng đặc biệt gọi là Event Emitter.

1. Event Emitter là gì?

Event Emitter là một đối tượng trong Node.js có khả năng phát ra (emit) các sự kiện (events) và gọi các hàm lắng nghe (listeners) được đăng ký (register) với các sự kiện đó. Các sự kiện là những tín hiệu cho biết một hành động nào đó đã được hoàn thành, ví dụ như kết nối đến một máy chủ, đọc một tập tin, nhận một dữ liệu, v.v. Các hàm lắng nghe là những hàm được thực thi khi một sự kiện xảy ra, ví dụ như gửi một phản hồi, xử lý một dữ liệu, ghi một tập tin, v.v.

Event Emitter là một lớp (class) được cung cấp bởi module events của Node.js. Để sử dụng Event Emitter, chúng ta cần yêu cầu (require) module events và tạo một đối tượng Event Emitter mới:

//Yêu cầu module events
const events = require('events');

//Tạo một đối tượng Event Emitter mới
const eventEmitter = new events.EventEmitter();

2. Cách sử dụng Event Emitter

Để sử dụng Event Emitter, chúng ta cần làm hai việc chính: đăng ký các hàm lắng nghe với các sự kiện, và phát ra các sự kiện khi cần thiết.

2.1. Đăng ký các hàm lắng nghe

Để đăng ký một hàm lắng nghe với một sự kiện, chúng ta sử dụng phương thức on hoặc addListener của đối tượng Event Emitter. Phương thức này nhận hai tham số: tên của sự kiện, và hàm lắng nghe. Hàm lắng nghe có thể là một hàm được định nghĩa trước, hoặc một hàm ẩn danh (anonymous function).

Ví dụ, chúng ta có thể đăng ký một hàm lắng nghe với sự kiện hello như sau:

//Định nghĩa một hàm lắng nghe
function sayHello(name) {
  console.log('Hello, ' + name);
}

//Đăng ký hàm lắng nghe với sự kiện hello
eventEmitter.on('hello', sayHello);

Hoặc chúng ta có thể sử dụng một hàm ẩn danh như sau:

//Đăng ký một hàm ẩn danh với sự kiện hello
eventEmitter.on('hello', function(name) {
  console.log('Hello, ' + name);
});

Chúng ta có thể đăng ký nhiều hàm lắng nghe với cùng một sự kiện. Khi sự kiện được phát ra, các hàm lắng nghe sẽ được gọi theo thứ tự đăng ký.

Ví dụ, chúng ta có thể đăng ký hai hàm lắng nghe với sự kiện hello như sau:

//Đăng ký hàm lắng nghe thứ nhất
eventEmitter.on('hello', function(name) {
  console.log('Hello, ' + name);
});

//Đăng ký hàm lắng nghe thứ hai
eventEmitter.on('hello', function(name) {
  console.log('Công ty cố phần ' + name);
});

>>>>> Xem thêm bài viết tương tự tại đây:

2.2. Phát ra các sự kiện

Để phát ra một sự kiện, chúng ta sử dụng phương thức emit của đối tượng Event Emitter. Phương thức này nhận một hoặc nhiều tham số: tham số đầu tiên là tên của sự kiện, các tham số tiếp theo là các tham số được truyền vào các hàm lắng nghe.

Ví dụ, chúng ta có thể phát ra sự kiện hello với tham số là tên của một người như sau:

//Phát ra sự kiện hello với tham số là 'Stringee'
eventEmitter.emit('hello', 'Stringee');

Khi phát ra sự kiện hello, các hàm lắng nghe được đăng ký với sự kiện này sẽ được gọi, và tham số Stringee sẽ được truyền vào các hàm lắng nghe. Kết quả là chúng ta sẽ nhận được hai dòng in ra màn hình:

Hello, Stringee
Công ty cố phần, Stringee

3. Ví dụ về Event Emitter

Để minh họa cho cách sử dụng Event Emitter, chúng ta sẽ xem xét một ví dụ đơn giản: một đối tượng Timer có khả năng phát ra các sự kiện tick mỗi giây. Để tạo một đối tượng Timer, chúng ta sẽ kế thừa từ lớp Event Emitter, và sử dụng hàm setInterval để phát ra sự kiện tick mỗi giây.

//Yêu cầu module events
const events = require('events');

//Tạo một lớp Timer kế thừa từ Event Emitter
class Timer extends events.EventEmitter {
  //Tạo một phương thức start để bắt đầu đếm thời gian
  start() {
    //Sử dụng hàm setInterval để phát ra sự kiện tick mỗi giây
    setInterval(() => {
      //Phát ra sự kiện tick
      this.emit('tick');
    }, 1000);
  }
}

//Tạo một đối tượng Timer mới
const timer = new Timer();

//Đăng ký một hàm lắng nghe với sự kiện tick
timer.on('tick', () => {
  //In ra một dấu chấm
  console.log('.');
});

//Bắt đầu đếm thời gian
timer.start();

Khi chạy chương trình này, chúng ta sẽ thấy một dấu chấm được in ra màn hình mỗi giây, cho thấy sự kiện tick được phát ra liên tục.

Tổng kết

Trong bài blog này, chúng ta đã cùng nhau tìm hiểu về Event Emitter trong Node.js, một đối tượng có khả năng phát ra và lắng nghe các sự kiện. Chúng ta cũng đã hiểu Event Emitter là gì, cách sử dụng Event Emitter, và một ví dụ về Event Emitter. Tôi hy vọng bài viết này sẽ giúp bạn hiểu rõ hơn về kiến trúc hướng sự kiện của Node.js, và cách áp dụng nó vào các ứng dụng web của bạn. Hẹn gặp lại bạn ở các bài viết khác của Stringee tại đây.


Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy, Adavigo, bTaskee…

Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY

Banner bottom