Node.js: EventEmitter
Nhiều đối tượng trong một Node.js phát ra các sự kiện, ví dụ: net.Server phát ra một sự kiện mỗi khi một máy ngang hàng kết nối với nó, một fs.readStream phát ra một sự kiện khi tệp được mở. Tất cả các đối tượng phát ra các sự kiện thì những sự kiện đó đều là các thể hiện của events.EventEmitter.
Lớp EventEmitter
Như chúng ta đã thấy trong bài học trước, lớp EventEmitter nằm trong mô-đun events. Nó có thể truy cập được bằng cách như sau:
// đưa vào module events: var events = require('events'); // tạo một đối tượng của EventEmitter: var eventEmitter = new events.EventEmitter();
Khi một đối tượng EventEmitter gặp bất kỳ lỗi nào, thì nó sẽ tạo ra một sự kiện 'error'. Khi một trình nghe mới được thêm vào, thì sự kiện 'newListener' sẽ được kích hoạt và khi một trình nghe bị xóa, sự kiện 'removeListener' sẽ được kích hoạt.
EventEmitter cung cấp nhiều thuộc tính dạng on và emit. Thuộc tính on được sử dụng để liên kết một hàm với sự kiện, còn emit được sử dụng để kích hoạt một sự kiện.
Các phương thức
Phương thức và mô tả |
---|
addListener(event, listener) Thêm trình nghe vào cuối mảng trình nghe cho sự kiện đã chỉ định. Không có kiểm tra nào được thực hiện để xem liệu trình nghe đã được thêm hay chưa. Nhiều lời gọi sẽ truyền cùng một sự kết hợp giữa event và listener sẽ dẫn đến việc trình nghe được thêm nhiều lần. Trả về emitter, vì vậy các lời gọi có thể được xâu chuỗi. |
on(event, listener) Thêm trình nghe vào cuối mảng trình nghe cho sự kiện đã chỉ định. Không có kiểm tra nào được thực hiện để xem liệu trình nghe đã được thêm hay chưa. Nhiều lời gọi truyền cùng một sự kết hợp giữa sự kiện và trình nghe sẽ dẫn đến việc trình nghe được thêm nhiều lần. Trả về emitter, vì vậy các lời gọi có thể được xâu chuỗi. |
once(event, listener) Thêm trình nghe một lần vào sự kiện. Trình nghe này chỉ được gọi vào lần tiếp theo sự kiện được kích hoạt, sau đó sự kiện bị xóa. Trả về emitter, vì vậy các lời gọi có thể được xâu chuỗi. |
removeListener(event, listener) Loại bỏ một trình nghe khỏi mảng trình nghe cho sự kiện đã chỉ định. Lưu ý: Nó thay đổi các chỉ số mảng trong mảng trình nghe phía sau trình nghe. removeListener sẽ loại bỏ tối đa một phiên bản của một trình nghe khỏi mảng trình nghe. Nếu bất kỳ trình nghe đơn lẻ nào đã được thêm nhiều lần vào mảng trình nghe cho sự kiện được chỉ định, thì removeListener phải được gọi nhiều lần để loại bỏ từng cá thể. Trả về emitter, vì vậy các lời gọi có thể được xâu chuỗi. |
removeAllListists([event]) Loại bỏ tất cả các trình nghe hoặc những trình nghe của sự kiện đã chỉ định. Không nên xóa các trình nghe đã được thêm vào nơi khác trong mã, đặc biệt là khi nó nằm trên một trình phát mà bạn không tạo (ví dụ như socket hay file stream). Trả về emitter, vì vậy các lời gọi có thể được xâu chuỗi. |
setMaxListists(n) Theo mặc định thì EventEmitter sẽ đưa ra cảnh báo nếu có hơn 10 trình nghe được thêm vào cho một sự kiện cụ thể. Đây là một mặc định hữu ích giúp tìm kiếm rò rỉ bộ nhớ. Ta có thể đặt n = 0 để không giới hạn trình nghe được thêm vào. |
listeners(event) Trả về một mảng trình nghe cho sự kiện đã chỉ định. |
emit(event, [arg1], [arg2], [...]) Thực thi từng trình nghe theo thứ tự với các đối số được cung cấp. Trả về true nếu sự kiện có trình nghe, nếu không thì trả về false. |
Các phương thức mức lớp
Phương thức và mô tả |
---|
listeningCount (emitter, event) Trả về số lượng trình nghe cho một sự kiện nhất định. |
Các sự kiện
Sự kiện và mô tả |
---|
newListener
Sự kiện này được phát ra bất kỳ khi nào trình nghe được thêm vào. Khi sự kiện này được kích hoạt, trình nghe có thể chưa được thêm vào mảng trình nghe cho sự kiện. |
removeListener
Sự kiện này được phát ra khi ai đó xóa một trình nghe. Khi sự kiện này được kích hoạt thì trình nghe có thể vẫn chưa bị xóa khỏi mảng trình nghe cho sự kiện. |
Ví dụ
Tạo tệp js có tên demo_eventemitter.js và đưa vào đoạn code sau:
var events = require('events'); var eventEmitter = new events.EventEmitter(); // listener #1 var listner1 = function listner1() { console.log('listner1 đã được thực thi.'); } // listener #2 var listner2 = function listner2() { console.log('listner2 đã được thực thi.'); } // nạp sự kiện connection vào hàm listner1 eventEmitter.addListener('connection', listner1); // nạp sự kiện connection vào hàm listner2 eventEmitter.on('connection', listner2); var eventListeners = require('events').EventEmitter.listenerCount (eventEmitter,'connection'); console.log("Có " + eventListeners + " listner đang lắng nghe sự kiện connection"); // kích hoạt sự kiện connection eventEmitter.emit('connection'); // xóa hàm listner1 khỏi connection eventEmitter.removeListener('connection', listner1); console.log("listner1 tự giờ sẽ không làm việc."); // kích hoạt lại sự kiện connection eventEmitter.emit('connection'); eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection'); console.log("Có " + eventListeners + " listner đang lắng nghe sự kiện connection."); console.log("Program Ended.");
Thực thi:
C:\Users\Your name>node demo_eventlistener.js
Kết quả:
Có 2 listner đang lắng nghe sự kiện connection
listner1 đã được thực thi.
listner2 đã được thực thi.
listner1 tự giờ sẽ không làm việc.
listner2 đã được thực thi.
Có 1 listner đang lắng nghe sự kiện connection.
Program Ended.