Node.js events事件模塊

2018-02-16 12:00 更新

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

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

events模塊有一個簡單的類“EventEmitter”。

EventEmitter類

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

以下代碼提供了一個小代碼示例,其中我們訂閱了一個事件,然后引發(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 }); 

我們可以用一個簡單的 new EventEmitter 調(diào)用創(chuàng)建一個新的實例。

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

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

多個訂閱者

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

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

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

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

多個subscribers

注意

監(jiān)聽器按它們?yōu)槭录缘捻樞蛘{(diào)用。

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

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 
//  m.o2fo.com
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 }); 

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

取消訂閱

EventEmitter有一個removeListener函數(shù),它接收一個跟隨函數(shù)對象的事件名稱從偵聽隊列中進行刪除。

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

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

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

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

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

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

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

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

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

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號