1. 程式人生 > >個人隨記--node(二)

個人隨記--node(二)

EventEmitter 類

1,events 模組只提供了一個物件: events.EventEmitter。EventEmitter 的核心就是事件觸發與事件監聽器功能的封裝。

2,EventEmitter 提供了多個屬性,如 onemiton 函式用於繫結事件函式,emit 屬性用於觸發一個事件。

物件建立 :

var eventEmitter = new events.EventEmitter();

程式碼示例:

var events = require("events");
//建立 eventEmitter 物件
var eventEmitter = new events.EventEmitter();
//建立事件處理程式
var connectHandler = function () {
    console.log("連線成功");
    //觸發 data_received 事件
    eventEmitter.emit("data_received");
}

//繫結 connection  事件處理程式
eventEmitter.on("connection",connectHandler);

//使用匿名函式繫結 data_received 事件
eventEmitter.on("data_received",function () {
    console.log("資料接收成功");
});
//觸發事件 服務啟動後,先執行此程式碼
eventEmitter.emit("connection");

console.log("程式執行完畢");

服務啟動後,利用emit觸發繫結的名稱為connection事件。然後進行整個程式的執行,connection事件又對data_received事件進行觸發。

除了立即觸發事件,也可以延遲觸發和間歇性觸發:

 //3秒後執行
 setTimeout(function() {
     eventEmitter.emit('connection');
 }, 3000);
//每隔3秒就會執行
 setInterval(function () {
     eventEmitter.emit('connection');
 },3000);

注:同一個事件,可以新增多個監聽器。

//監聽器 listener1 和 listener2
var listener1 = function (){
    console.log('監聽器 listener1 執行。');
}
var listener2 = function (){
    console.log('監聽器 listener2 執行。');
}

//給connection事件繫結監聽器listener1和listener2
eventEmitter.addListener("connection", listener1);
eventEmitter.addListener("connection", listener2);

EventEmitter 其他屬性

1,addListener(event, listener),和on(event, listener) 一樣,都是給事件新增一個監聽器,暫未發現不同

2,once(event, listener) 為指定事件註冊一個單次監聽器,即 監聽器最多隻會觸發一次,觸發後立刻解除該監聽器。

3,removeListener(event, listener) 移除指定事件的某個監聽器,監聽器必須是該事件已經註冊過的監聽器。

var events = require("events");

//建立 eventEmitter 物件
var eventEmitter = new events.EventEmitter();

//監聽器 listener1 和 listener2
var listener1 = function (){
    console.log('監聽器 listener1 執行。');
}
var listener2 = function (){
    console.log('監聽器 listener2 執行。');
}

//給connection事件繫結監聽器listener1和listener2
eventEmitter.addListener("connection", listener1);
eventEmitter.addListener("connection", listener2);

//觸發connection事件  此時,listener1和listener2 都會執行
eventEmitter.emit('connection');

//移除listener1監聽器
eventEmitter.removeListener("connection",listener1);
console.log("listener1 被刪除");

//觸發connection事件  此時,只有listener2會執行
eventEmitter.emit('connection');

執行結果如下