在NodeJS裡面,其實對於EventEmitter 這個物件還蠻陌生的,甚至不知道它到底可以幫我做什麼。
其實它的功能主要可以讓事件觸發更為彈性。在一般瀏覽器當中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
解說:
測試程式,先宣告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,或者參考CommonJS - Events。
本文資料參考於Let's Make a Framework: Custom Events,在此特別註明。
NodeJS Taiwan期待更多人的支持,希望能夠聽到你的回應及分享。
留言
張貼留言