openplanning

Hướng dẫn và ví dụ NodeJS EventEmitter

  1. NodeJS EventEmitter
  2. Ví dụ EventEmitter
  3. Lớp EventEmitter

1. NodeJS EventEmitter

NodeJS hỗ trợ các sự kiện trong các ứng dụng rất hoàn hảo. Mỗi hành động trong máy tính được gọi là 1 sự kiện (event). Chẳng hạn khi bạn đọc một tập tin trên ổ cứng, thì có nghĩa là bạn phải thực hiện 2 hành động "mở tập tin""đóng tập tin" sau khi đọc xong, như vậy ở đây chúng ta có 2 sự kiện "Mở" & "Đóng". Dựa trên các sự kiện bạn có trèn các mã của bạn để làm một việc gì đó.
var fs = require('fs');

// Create a stream to read file
var rs = fs.createReadStream('C:/test/demo.txt');

// The event 'open':
rs.on('open', function() {
    console.log('File opened!');
});
Module events cung cấp cho bạn lớp EventEmitter, nó là một lớp trung tâm trong NodeJS hỗ trợ định nghĩa ra một sự kiện, đăng ký các Listener (Đối tượng lắng nghe) sự kiện này, và phát ra (emit) sự kiện.
Listener
Trong NodeJS, Listener là một hàm, nó sẽ được gọi để thực thi khi sự kiện xẩy ra. Có thể có 0, 1 hoặc nhiều Listener đang được gắn (bind) với sự kiện đó.
Để đơn giản, bạn hãy quan sát hình minh họa dưới đây, 1 con chuột và một cái bẫy chuột. Một sự kiện chuẩn bị xẩy ra. Khi sự kiện xẩy ra (Miếng bánh bị đánh cắp), cái bẫy chuột sẽ thực hiện nhiệm vụ của nó. Cái bẫy chuột ở đây chính là một "Listener", nó sẽ hoạt động khi sự kiện xuất hiện.

2. Ví dụ EventEmitter

Nhập khẩu module events, và khai báo một đối tượng EventEmitter:
// Import events module
var events = require('events');


// Create an EventEmitter object
var eventEmitter = new events.EventEmitter();
Đăng ký các Listener (Các hàm sẽ được gọi thực thi khi sự kiện xẩy ra).
// Add Event Listener
eventEmitter.addListener('bellRing', bellRingHandler1);

// Add Event Listener
eventEmitter.addListener('bellRing', bellRingHandler2);
Phát ra sự kiện:
// Fire bellRing event!!
eventEmitter.emit('bellRing', 'Jerry');
first-example.js
// Import events module
var events = require('events');


// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

// A Listener
var bellRingHandler1 = function bellRingHandler1(who) {
   console.log("\n");
   console.log('The Bell Ringing..... (Handler 1)');

   console.log(" " + who + " was standing behind the door!");
   if(who == 'Jerry') {
       console.log(' Tom, help me!!');
       return;
   }
   console.log(" Welcome " + who);
}

// A Listener
var bellRingHandler2 = function bellRingHandler2(who) {
   console.log("\n");
   console.log('The Bell Ringing..... (Handler 2)');

   eventEmitter.emit("nobodyIsAtHome");
}

// A Listener
var nobodyIsAtHomeHandler = function nobodyIsAtHomeHandler()  {
   console.log("\n");
   console.log(" Sorry, Nobody is at home now, Please leave your message!")
}


// Add Event Listeners
eventEmitter.addListener('bellRing', bellRingHandler1);
eventEmitter.addListener('bellRing', bellRingHandler2);

eventEmitter.addListener('nobodyIsAtHome', nobodyIsAtHomeHandler);

// ----- Testing ------

// Fire bellRing event!!
eventEmitter.emit('bellRing', 'Jerry');
Chạy ví dụ:
node eventemitter-examples/first-example.js

3. Lớp EventEmitter

No
Phương thức
Mô tả
1
addListener(event, listener)

Thêm một listener vào phía cuối của mảng listeners cho sự kiện được chỉ định. Phương thức này không kiểm tra rằng listener này đã từng được thêm vào hay chưa.

2
on(event, listener)

Phương thức này chính xác là giống 100% với phương thức addListener.

3
once(event, listener)

Thêm một listener vào mảng listeners của sự kiện được chỉ định. Nhưng listener này chỉ được gọi 1 lần khi sự kiện xẩy ra. Sau đó nó bị loại bỏ ra khỏi mảng.

4
removeListener(event, listener)

Loại bỏ một listener ra khỏi mảng listeners của sự kiện được chỉ định. Nếu một listener đã được thêm vào mảng này nhiều lần, để loại bỏ hết listener này bạn cần phải gọi phương thức này nhiều lần.

5
removeAllListeners([event])

Loại bỏ tất cả các listener, hoặc loại bỏ tất cả các listener của một sự kiện được chỉ định.

6
setMaxListeners(n)

Theo mặc định, EventEmitter sẽ in ra cảnh báo nếu có nhiều hơn 10 listener đượ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 ra các rò rỉ bộ nhớ (memory leaks). Bạn có thể thiết lập một con số khác, hoặc thiết lập là 0 nếu bạn muốn nó không giới hạn (unlimited).

7
listeners(event)

Trả về một mảng các listener cho sự kiện được chỉ định.

8
emit(event,
[arg1], [arg2], [...])

Thực thi lần lượt từng listener trong mảng, với các tham số. Trả về true nếu mảng có ít nhất một listener, ngược lại trả về false.