Node.js自帶了對(duì)核心events模塊中的events的內(nèi)置支持。
使用require("events")加載模塊。
events模塊有一個(gè)簡(jiǎn)單的類“EventEmitter”。
EventEmitter是一個(gè)類,旨在使其易于發(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)使用事件名稱中的 on
函數(shù)傳遞,后面跟隨事件處理函數(shù)。
最后,我們使用 emit
函數(shù)引發(fā)一個(gè)事件,傳遞跟隨有任意數(shù)量我們想傳遞給監(jiān)聽器的參數(shù)的事件名稱。
以下代碼顯示了如何為一個(gè)事件擁有多個(gè)訂閱者。
var EventEmitter = require("events").EventEmitter;
var emitter = new EventEmitter();
//from www.15014759268.cn
emitter.on("foo", function () {
console.log("subscriber 1");
});
emitter.on("foo", function () {
console.log("subscriber 2");
});
// Emit
emitter.emit("foo");
上面的代碼生成以下結(jié)果。
監(jiān)聽器按它們?yōu)槭录?cè)的順序調(diào)用。
為事件傳入的任何參數(shù)在各個(gè)訂閱者之間共享。
var EventEmitter = require("events").EventEmitter;
var emitter = new EventEmitter();
// www.15014759268.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)聽器修改了傳遞的事件參數(shù),第二個(gè)監(jiān)聽器獲取了修改的對(duì)象。
EventEmitter有一個(gè)removeListener函數(shù),它接收一個(gè)跟隨函數(shù)對(duì)象的事件名稱從偵聽隊(duì)列中進(jìn)行刪除。
我們必須有一個(gè)對(duì)你想從監(jiān)聽隊(duì)列中刪除的函數(shù)的引用。
以下代碼顯示如何取消訂閱監(jiān)聽器。
var EventEmitter = require("events").EventEmitter;
var emitter = new EventEmitter();
//from www.15014759268.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)聽器“once”的函數(shù)。
var EventEmitter = require("events").EventEmitter;
var emitter = new EventEmitter();
/*www.15014759268.cn*/
emitter.once("foo", function () {
console.log("foo has been raised");
});
// Emit twice
emitter.emit("foo");
emitter.emit("foo");
foo的事件監(jiān)聽器將只被調(diào)用一次。
更多建議: