EventEmitter是node.js提供的事件註冊器API
利用EventEmitter可以讓你的API提供使用者自訂行為的介面
藉由匯出EventEmitter的實體,就能讓使用者自訂流程中的某些行為
也可以選擇不要利用這樣的特性,只是單純利用事件註冊器來簡化需要事件的部分
要使用EventEmitter,必須先建立它的實體,像這樣:
這裡可以看到,我先建立了一個要當建構式(就是用new調用的函數,注意JS並沒有建構式,這裡只是用一個方便溝通的說法)的函數,然後利用了util模組提供的繼承函數(這裡也是,JS並沒有繼承這回事,這個函式真正做的事是,如果第一個參數沒有第二個參數的某個特性,就為它加上這個特性),所以我們現在會得到一個可以被new調用的函數,名稱是InstanceTemplate
接著改動它的原型
你可以看到,它的原型上多出了一個check函數
嘿!等等,emit是什麼東西啊
問得好,我不知道(誤)
不對啦!emit是指,在這裡呼叫監聽器來處理,第一個參數就是監聽器的名稱,接下來則是要給監聽器的callback使用的參數,如果你不知道什麼是callback,什麼,你認真???
你根本還不太會JavaScript,你應該去找JS的基礎教程重頭學起
那麼不知道this呢,這問題有水準,JS的this的語意是依照呼叫位置來決策的,在這裡,因為要用new調用InstanceTemplate,所以this是指它所產生的實例(想進一步了解可以去看You don't know JS系列,或是你想等到我去寫這方面的文章也是可以啦,大概要等超久的)
you-dont-know-js-this--object-prototypes
這就是YDKJS的連結,慢慢看
接著我們得創建實例好註冊監聽器
註冊監聽器
最後匯出實例
接著我們就能調用instance.prototype上的call函數
如不意外,我們能看到
這一切是怎麼發生的?
首先,const instance要求./EE.js 給出它所開放的介面,也就是module export的部分,由於我們用module.exports匯出instance(注意,EE.js中的instance不是app.js的instance),所以const instance 就會得到EE's instance,接著我們調用call,call會發出一個事件給名為called的監聽器,called又將事件所發出的參數印出,於是就成了我們所看到的Be called了
對EventEmitter的介紹就暫時這樣吧,Good luck
沒有留言:
張貼留言