Node.js - Trình phát sự kiện
Nhiều đối tượng trong một Node 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 là các thể hiện của sự kiện.EventEmitter.
Lớp EventEmitter
Như chúng ta đã thấy trong phần trước, lớp EventEmitter nằm trong mô-đun sự kiện. Nó có thể truy cập được thông qua mã sau:
// Import events module
var events = require('events');
// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();
Khi một cá thể EventEmitter gặp bất kỳ lỗi nào, nó sẽ tạo ra một sự kiện 'lỗi'. Khi một trình nghe mới được thêm vào, 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 như on và emit. on thuộc tính được sử dụng để liên kết một hàm với sự kiện và emit được sử dụng để kích hoạt một sự kiện.
Phương pháp
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | addListener(event, listener) Thêm trình lắng 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 người nghe đã được thêm hay chưa. Nhiều cuộc gọi chuyển cùng một tổ hợp sự kiện và trình nghe sẽ dẫn đến việc người nghe được thêm nhiều lần. Trả về emitter, vì vậy các cuộc gọi có thể được xâu chuỗi. |
2 | on(event, listener) Thêm trình lắng 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 người nghe đã được thêm hay chưa. Nhiều cuộc gọi chuyển cùng một tổ hợp sự kiện và trình nghe sẽ dẫn đến việc người nghe được thêm nhiều lần. Trả về emitter, vì vậy các cuộc gọi có thể được xâu chuỗi. |
3 | once(event, listener) Thêm người 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 cuộc gọi có thể được xâu chuỗi. |
4 | removeListener(event, listener) Xóa một trình nghe khỏi mảng trình nghe cho sự kiện đã chỉ định. Caution −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 cuộc gọi có thể được xâu chuỗi. |
5 | removeAllListeners([event]) Xóa tất cả người nghe hoặc những người của sự kiện được 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ụ: ổ cắm hoặc luồng tệp). Trả về emitter, vì vậy các cuộc gọi có thể được xâu chuỗi. |
6 | setMaxListeners(n) Theo mặc định, EventEmitters sẽ in cảnh báo nếu có hơn 10 người 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ớ. Rõ ràng là không phải tất cả các Bộ phát nên được giới hạn ở 10. Chức năng này cho phép tăng điều đó. Đặt thành 0 không giới hạn. |
7 | listeners(event) Trả về một mảng trình nghe cho sự kiện đã chỉ định. |
số 8 | 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ó người nghe, nếu không thì trả về false. |
Phương pháp lớp học
Sr.No. | Phương pháp & Mô tả |
---|---|
1 | listenerCount(emitter, event) Trả về số lượng người nghe cho một sự kiện nhất định. |
Sự kiện
Sr.No. | Sự kiện & Mô tả |
---|---|
1 | newListener
Sự kiện này được phát ra bất cứ khi nào người nghe được thêm vào. Khi sự kiện này được kích hoạt, người nghe có thể chưa được thêm vào mảng người nghe cho sự kiện. |
2 | removeListener
Sự kiện này được phát ra bất cứ khi nào ai đó xóa một người nghe. Khi sự kiện này được kích hoạt, người nghe có thể vẫn chưa bị xóa khỏi mảng người nghe cho sự kiện. |
Thí dụ
Tạo một tệp js có tên main.js với mã Node.js sau:
var events = require('events');
var eventEmitter = new events.EventEmitter();
// listener #1
var listner1 = function listner1() {
console.log('listner1 executed.');
}
// listener #2
var listner2 = function listner2() {
console.log('listner2 executed.');
}
// Bind the connection event with the listner1 function
eventEmitter.addListener('connection', listner1);
// Bind the connection event with the listner2 function
eventEmitter.on('connection', listner2);
var eventListeners = require('events').EventEmitter.listenerCount
(eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");
// Fire the connection event
eventEmitter.emit('connection');
// Remove the binding of listner1 function
eventEmitter.removeListener('connection', listner1);
console.log("Listner1 will not listen now.");
// Fire the connection event
eventEmitter.emit('connection');
eventListeners = require('events').EventEmitter.listenerCount(eventEmitter,'connection');
console.log(eventListeners + " Listner(s) listening to connection event");
console.log("Program Ended.");
Bây giờ hãy chạy main.js để xem kết quả -
$ node main.js
Xác minh đầu ra.
2 Listner(s) listening to connection event
listner1 executed.
listner2 executed.
Listner1 will not listen now.
listner2 executed.
1 Listner(s) listening to connection event
Program Ended.