Node.js 事件處理程序

2018-02-16 16:58 更新

監(jiān)聽器管理

EventEmitter有一個(gè)成員函數(shù) listeners ,它接收一個(gè)事件名稱并返回所有監(jiān)聽器訂閱該事件。

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

emitter.on("foo", function a() { }); 
emitter.on("foo", function b() { }); 

console.log(emitter.listeners("foo")); // [ [Function: a], [Function: b] ] 

EventEmitter實(shí)例每當(dāng)添加一個(gè)新的監(jiān)聽器時(shí)都會(huì)引發(fā)一個(gè)`newListener`事件,當(dāng)一個(gè)監(jiān)聽器被移除時(shí)會(huì)引發(fā)`removeListener`。

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 
/*o2fo.com*/
// Listener addition / removal notifications 
emitter.on("removeListener", function (eventName, listenerFunction) {
     console.log(eventName, "listener removed", listenerFunction.name); 
}); 
emitter.on("newListener", function (eventName, listenerFunction) {
     console.log(eventName, "listener added", listenerFunction.name); 
}); 

function a() { } 
function b() { } 

// Add 
emitter.on("foo", a); 
emitter.on("foo", b); 

// Remove 
emitter.removeListener("foo", a); 
emitter.removeListener("foo", b); 

EventEmitter監(jiān)聽器計(jì)數(shù)

默認(rèn)情況下,EventEmitter將允許每個(gè)事件類型有10個(gè)監(jiān)聽器,并且它將向控制臺(tái)打印警告。

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 
/*o2fo.com*/
var listenersCalled = 0; 

function someCallback() {
   // Add a listener
    emitter.on("foo", function () { listenersCalled++ });
    // return from callback 
} 

for (var i = 0; i < 20; i++) {
   someCallback(); 
} 
emitter.emit("foo"); 
console.log("listeners called:", listenersCalled); // 20 

有些情況下,有超過(guò)10個(gè)監(jiān)聽器是有效的場(chǎng)景。

在這種情況下,你可以使用setMaxListeners成員函數(shù)增加此警告的限制。

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 
/* o2fo.com */
// increase limit to 30 
emitter.setMaxListeners(30); 

// subscribe 20 times 
// No warning will be printed 
for (var i = 0; i < 20; i++) {
    emitter.on("foo", function () { }); 
} 
console.log("done"); 

錯(cuò)誤事件

“error"事件在Node.js中被視為特殊情況。

如果沒有監(jiān)聽器,那么默認(rèn)動(dòng)作是打印堆棧跟蹤并退出程序。

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

// Emit an error event 
// Since there is no listener for this event the process terminates 
emitter.emit("error", new Error("Something horrible happened")); 

console.log("this line never executes"); 

如果你需要引發(fā)錯(cuò)誤事件,則應(yīng)使用Error對(duì)象。

你還可以從示例中看到,包含console.log的最后一行永遠(yuǎn)不會(huì)在進(jìn)程終止時(shí)執(zhí)行。

創(chuàng)建自己的Event Emitters

許多庫(kù)導(dǎo)出繼承自EventEmitter并遵循相同事件處理機(jī)制的類。

我們可以擴(kuò)展EventEmitter并創(chuàng)建一個(gè)具有EventEmitter所有功能的公共類。

所有你需要做的創(chuàng)建自己的EventEmitter是從你的類的構(gòu)造函數(shù)調(diào)用EventEmitter構(gòu)造函數(shù),并使用util.inherits函數(shù)來(lái)設(shè)置原型鏈。

var EventEmitter = require("events").EventEmitter; 
var inherits = require("util").inherits; 
/*o2fo.com*/
// Custom class 
function Foo() { 
    EventEmitter.call(this); 
} 
inherits(Foo, EventEmitter); 

// Sample member function that raises an event 
Foo.prototype.connect = function () { 
    this.emit("connected"); 
} 

// Usage 
var foo = new Foo(); 
foo.on("connected", function () {
     console.log("connected raised!"); 
}); 
foo.connect(); 

你可以看到類的使用是完全一樣的,因?yàn)樗且粋€(gè)EventEmitter。

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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)