W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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);
默認(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");
“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í)行。
許多庫(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。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: