国产chinesehdxxxx野外,国产av无码专区亚洲av琪琪,播放男人添女人下边视频,成人国产精品一区二区免费看,chinese丰满人妻videos

Node.js 事件處理程序

2018-02-16 16:58 更新

監(jiān)聽器管理

EventEmitter有一個成員函數(shù) listeners ,它接收一個事件名稱并返回所有監(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實例每當添加一個新的監(jiān)聽器時都會引發(fā)一個`newListener`事件,當一個監(jiān)聽器被移除時會引發(fā)`removeListener`。

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 
/*eska-fuses.cn*/
// 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)聽器計數(shù)

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

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 
/*eska-fuses.cn*/
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 

有些情況下,有超過10個監(jiān)聽器是有效的場景。

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

var EventEmitter = require("events").EventEmitter; 
var emitter = new EventEmitter(); 
/* eska-fuses.cn */
// 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"); 

錯誤事件

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

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

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ā)錯誤事件,則應(yīng)使用Error對象。

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

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

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

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

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

var EventEmitter = require("events").EventEmitter; 
var inherits = require("util").inherits; 
/*eska-fuses.cn*/
// 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(); 

你可以看到類的使用是完全一樣的,因為它是一個EventEmitter。

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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號