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
Stt | Phương thức & Miêu tả |
---|---|
1 | addListener(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ể |
2 | on(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ể |
3 | once(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 |
4 | removeListener(event, listener) Xóa một Listener ra khỏi mảng các Listener cho một sự kiện nào đó. |
5 | removeAllListeners([event]) Xóa tất cả Listener của một sự kiện |
6 | setMaxListeners(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 |
7 | listeners(event) Trả về một mảng bao gồm các Listener cho một sự kiện cụ thể nào đó |
8 | emit(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
Stt | Sự kiện & Miêu tả |
---|---|
1 | newListener
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 |
2 | removeListener
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.
Theo Tutorialspoint
Bài trước: Event Loop trong Node.js
Bài tiếp: Khái niệm Buffer trong Node.js