[分享] NodeJS 如何使用EventEmitter 自訂事件

[![](http://3.bp.blogspot.com/-BBVRihV2Mdc/TgXWNZ5nJaI/AAAAAAAAMfs/ZMvVNg8Cx7o/s320/images.jpg)](http://3.bp.blogspot.com/-BBVRihV2Mdc/TgXWNZ5nJaI/AAAAAAAAMfs/ZMvVNg8Cx7o/s1600/images.jpg)
在[NodeJS](http://clonn.blogspot.com/2011/06/nodejscomet.html)裡面,其實對於[EventEmitter](http://nodejs.org/docs/v0.4.8/api/events.html) 這個物件還蠻陌生的,甚至不知道它到底可以幫我做什麼。 其實它的功能主要可以讓事件觸發更為彈性。在一般瀏覽器當中Javascript 事件綁定通常使用addlistener,通常觸發事件範圍會有限,像通常使用的事件綁定,click, hover, focus, blur…,但是當我們想要自訂個觸發點為’explode’,就會受限於此,因此EventEmitter ,這個物件就誕生了。 它的出現可以讓物件繼承EventEmitter ,用來綁定、觸發事件的發生點。畢竟NodeJS是一個後端的程式,需求通常會比前端的類型多很多,就來看看一下實際範例會怎麼使用。 測試程式碼: `var EventEmitter = require('events').EventEmitter,

bomb = new EventEmitter();



console.log("bomb event binding");

bomb.on('explode', function() {

console.log('BOOM!');

});



console.log("bomb 'explode' event trigger");

bomb.emit('explode');

` []() 實際執行 `node test.js

`
[![](http://2.bp.blogspot.com/-1hit5edYhyo/Tg04q8xc7oI/AAAAAAAAMjc/wIW19m_vnaw/s1600/%25E5%259C%2596%25E7%2589%2587+1.png)](http://2.bp.blogspot.com/-1hit5edYhyo/Tg04q8xc7oI/AAAAAAAAMjc/wIW19m_vnaw/s1600/%25E5%259C%2596%25E7%2589%2587+1.png)
解說: 測試程式,先宣告EventEmitter 物件,讓bomb來繼承,之後就可以使用on的方式綁定事件行為,接下來再使用emit來觸發事件。 EventEmitter.addListener : `EventEmitter.prototype.addListener = function(type, listener) {

// ...

if (!this._events[type]) {

this._events[type] = listener;

}

// ...

` EventEmitter的addListener ,將type做為_events的private key,再將事件填入。 EventEmitter.prototype.emit: `EventEmitter.prototype.emit = function(type) {

if (!this._events) return false;

var handler = this._events[type];

if (!handler) return false;



if (typeof handler == 'function') {

switch (arguments.length) {

case 1:

handler.call(this);

// ...



}

//...

` emit觸發的時候,當找不到事件就直接返回,接著找到對應的事件,也確定handler 為事件(function)的時候,直接呼叫觸發。 後記: NodeJS因為有了EventEmitter這個物件之後,就可以靈活的綁定自訂事件,其實對於程式上幫助還蠻大的,很多程式要觸發,都可以綁定關鍵字,等到特定時間點再觸發。而EventEmitter的規範可以參考[NodeJS api – Events](http://nodejs.org/docs/v0.4.8/api/events.html),或者參考[CommonJS – Events](http://wiki.commonjs.org/wiki/Events/A#NameEmitter)。 本文資料參考於[Let’s Make a Framework: Custom Events](http://dailyjs.com/2011/06/30/framework-69/?utm_source=feedburner&utm_medium=feed&utm_campaign=Feed%3A+dailyjs+%28DailyJS%29),在此特別註明。
[NodeJS Taiwan](http://www.facebook.com/NodeJS.tw)期待更多人的支持,希望能夠聽到你的回應及分享。

CaesarChi

Web developer, focus on website fullstack, special JavaScript, and love sharing developing experience and communicate with developers. http://about.me/clonn