AZCode.vn AZCode

Event Emitter trong Node.js

Nhiều đối tượng trong Node.js sinh ra các sự kiện, ví dụ net.Server sinh ra một sự kiện mỗi khi có một kết nối ngang hàng đến nó, hay fs.readStream sinh ra sự kiện khi một file được mở. Tất cả các đối tượng này đều là sự thể hiện của lớp events.EventEmitter trong Node.js.

Lớp EventEmitter trong Node.js

Lớp EventEmitter nằm trong events Module. Lớp này được truy cập qua cú pháp sau:

// Khai bao events Module
var events = require('events');
// Tao mot doi tuong eventEmitter
var eventEmitter = new events.EventEmitter();

Khi một EventEmitter gặp bất kì lỗi nào, nó sẽ sinh ra một Error Event. Khi một Listener mới được thêm, sự kiện 'newListener' sẽ được kích hoạt và một Listener sẽ bị loại bỏ, sự kiện 'removeListener' sẽ được kích hoạt.

Event Emitter cung cấp nhiều thuộc tính như on hay emit. Thuộc tính on được sử dụng để gắn kết một hàm với sự kiện, và emit dược sử dụng để kích hoạt một sự kiện.

Các phương thức của lớp EventEmitter trong Node.js

SttPhương thức & Miêu tả
1addListener(event, listener)
Thêm một Listener vào phần cuối của mảng các Listener cho một sự kiện cụ thể
2on(event, listener)
Thêm một Listener vào phần cuối của mảng các Listener cho một sự kiện cụ thể
3once(event, listener)
Thêm một One-Time Listener cho sự kiện. Listener dạng này sẽ chỉ được gọi khi sự kiện được kích hoạt, sau đó nó sẽ bị xóa
4removeListener(event, listener)
Xóa một Listener ra khỏi mảng các Listener cho một sự kiện nào đó.
5removeAllListeners([event])
Xóa tất cả Listener của một sự kiện
6setMaxListeners(n)
Theo mặc định, lớp EventEmitters sẽ in một lời cảnh báo nếu bạn thêm nhiều hơn 10 Listener cho một sự kiện cụ thể. Việc này khá hữu ích, bởi vì nó sẽ giúp tìm ra các lỗi gây rò rỉ bộ nhớ. Tất nhiên, không phải tất cả các Emitters đều cần được giới hạn với con số là 10. Hàm này cho phép bạn tăng con số đó. Thiết lập nó về 0 để không giới hạn lượng Listener cần thêm
7listeners(event)
Trả về một mảng bao gồm các Listener cho một sự kiện cụ thể nào đó
8emit(event, [arg1], [arg2], [...])
Thực thi từng Listener với các tham số đã cho. Trả về true nếu sự kiện có các Listener, và false nếu không có

Các sự kiện của lớp EventEmitter trong Node.js

SttSự kiện & Miêu tả
1newListener
  • event - Dạng chuỗi, biểu diễn tên sự kiện

  • listener - Tên hàm xử lý sự kiện

Sự kiện này được sinh bất cứ khi nào bạn thêm một Listener. Khi sự kiện này được kích hoạt, Listener có thể sẽ chưa được thêm vào mảng Listener của sự kiện

2removeListener
  • event - Dạng chuỗi, biểu diễn tên sự kiện

  • listener - Tên hàm xử lý sự kiện

Sự kiện này xảy ra bất cứ khi nào có ai đó xóa một Listener. Khi một sự kiện được kích hoạt, Listener này chưa được xóa khỏi mảng Listener của sự kiện

Ví dụ minh họa lớp EventEmitter trong Node.js

Tạo một file js với tên là main.js với nội dụng Node.js như dưới đây. Trong main.js, đầu tiên bạn khai báo events Module bởi sử dụng phương thức require(). Tiếp đó, bạn sử dụng phương thức addListener() để thêm một Listener cho một sự kiện nào đó, và sử dụng các thuộc tính on và emit để thực hiện các tính năng đã trình bày ở trên.

var events = require('events');
var eventEmitter = new events.EventEmitter();

// listener #1
var listner1 = function listner1() {
   console.log('listener1 duoc thuc thi.');
}

// listener #2
var listner2 = function listner2() {
  console.log('listener2 duoc thuc thi.');
}

// Gan ket su kien connection voi ham listner1
eventEmitter.addListener('connection', listner1);

// Gan ket su kien connection voi ham listner2
eventEmitter.on('connection', listner2);

var eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " Event Listner dang lang nghe su kien connection");

// Fire the connection event 
eventEmitter.emit('connection');

// Remove the binding of listner1 function
eventEmitter.removeListener('connection', listner1);
console.log("Bay gio, Listner1 se khong lang nghe.");

// Fire the connection event 
eventEmitter.emit('connection');

eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " Event Listner dang lang nghe su kien connection");

console.log("Ket thuc chuong trinh.");

Chạy main.js để xem kết quả:

$ node main.js

Kiểm tra kết quả:

2 Event Listner dang lang nghe su kien connection
listener1 duoc thuc thi.
listener2 duoc thuc thi.
Bay gio, Listner1 se khong lang nghe.
listener2 duoc thuc thi.
1 Event Listner dang lang nghe su kien connection
Ket thuc chuong trinh.

Các bài học NodeJS phổ biến khác tại AZCode: