Node.js events事件模塊

2018-02-16 12:00 更新

Node.js自帶了對(duì)核心events模塊中的events的內(nèi)置支持。

使用require("events")加載模塊。

events模塊有一個(gè)簡(jiǎn)單的類(lèi)“EventEmitter”。

EventEmitter類(lèi)

EventEmitter是一個(gè)類(lèi),旨在使其易于發(fā)出events和訂閱引發(fā)的events。

以下代碼提供了一個(gè)小代碼示例,其中我們訂閱了一個(gè)事件,然后引發(fā)它。

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 

// Subscribe 
emitter.on("foo", function (arg1, arg2) {
   console.log("Foo raised, Args:", arg1, arg2); 
}); 
// Emit 
emitter.emit("foo", { a: 123 }, { b: 456 }); 

我們可以用一個(gè)簡(jiǎn)單的 new EventEmitter 調(diào)用創(chuàng)建一個(gè)新的實(shí)例。

要訂閱events,請(qǐng)使用事件名稱(chēng)中的 on 函數(shù)傳遞,后面跟隨事件處理函數(shù)。

最后,我們使用 emit 函數(shù)引發(fā)一個(gè)事件,傳遞跟隨有任意數(shù)量我們想傳遞給監(jiān)聽(tīng)器的參數(shù)的事件名稱(chēng)。

多個(gè)訂閱者

以下代碼顯示了如何為一個(gè)事件擁有多個(gè)訂閱者。

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 
//from   m.hgci.cn
emitter.on("foo", function () {
    console.log("subscriber 1"); 
}); 
emitter.on("foo", function () {
    console.log("subscriber 2"); 
}); 

// Emit 
emitter.emit("foo"); 

上面的代碼生成以下結(jié)果。

多個(gè)subscribers

注意

監(jiān)聽(tīng)器按它們?yōu)槭录?cè)的順序調(diào)用。

為事件傳入的任何參數(shù)在各個(gè)訂閱者之間共享。

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 
//  m.hgci.cn
emitter.on("foo", function (ev) {
    console.log("subscriber 1:", ev);
    ev.handled = true; 
}); 

emitter.on("foo", function (ev) { 
   if (ev.handled) { 
      console.log("event already handled"); 
   } 
}); 

// Emit 
emitter.emit("foo", {handled: false }); 

在此示例中,第一個(gè)監(jiān)聽(tīng)器修改了傳遞的事件參數(shù),第二個(gè)監(jiān)聽(tīng)器獲取了修改的對(duì)象。

取消訂閱

EventEmitter有一個(gè)removeListener函數(shù),它接收一個(gè)跟隨函數(shù)對(duì)象的事件名稱(chēng)從偵聽(tīng)隊(duì)列中進(jìn)行刪除。

我們必須有一個(gè)對(duì)你想從監(jiān)聽(tīng)隊(duì)列中刪除的函數(shù)的引用。

以下代碼顯示如何取消訂閱監(jiān)聽(tīng)器。

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 
//from   m.hgci.cn
var fooHandler = function () { 
    console.log("handler called");
    // Unsubscribe 
    emitter.removeListener("foo",fooHandler); 
}; 

emitter.on("foo", fooHandler); 
// Emit twice 
emitter.emit("foo"); 
emitter.emit("foo"); 

在此示例中,我們?cè)谝l(fā)一次后取消訂閱事件。結(jié)果,第二事件不被注意。

EventEmitter提供了僅一次調(diào)用已注冊(cè)監(jiān)聽(tīng)器“once”的函數(shù)。

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 
/*m.hgci.cn*/
emitter.once("foo", function () {
     console.log("foo has been raised"); 
}); 

// Emit twice 
emitter.emit("foo"); 
emitter.emit("foo"); 

foo的事件監(jiān)聽(tīng)器將只被調(diào)用一次。

以上內(nèi)容是否對(duì)您有幫助:
在線(xiàn)筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)