天天看點

筆記-Nodejs中的核心API之Events

最近正在學習Node,在圖書館借了基本關于Node的書,同時在網上查閱資料,頗有收獲,但是整體感覺對Node的了解還是停留在一個很模棱兩可的狀态。比如Node中的子產品,平時練習就接觸到那麼幾個,其他的一些子產品暫時隻會在學習的時候接觸到,不常用便就荒廢了。正所謂好記心不如爛筆頭,多做筆記還是更有利于了解和記憶。自己做的總結也友善回頭複習,是以決定踏上漫長的修煉之旅……

Node提供了許多API,其中一些比較重要。這些核心的API是所有Node應用的支柱,你會不停的用到他們。

幾乎所有的子產品都是建立在Event子產品的基礎上誕生的,而Event子產品隻提供了一個對象:events.EventEmitter,其核心功能就是事件發射和事件監聽功能的封裝。

Node建立了一個EventEmitter類提供基礎的事件功能,所有的Node的事件功能都圍繞着EventEmitter,因為它的設計包含了其他類拓展所需要的接口類。EventEmitter的每一個事件由一個事件名和若幹個參數組成,事件名是一個字元串,通常表達一定的語義。每一個事件都支援若幹個事件監聽器。當事件發射時,注冊的事件監聽器一次被調用,同時參數作為回調函數的參數傳遞要注意,通常不會直接調用EventEmitter對象,我們可以通過

require(‘events‘).EventEmitter 擷取 EventEmitter 類。

EventEmitter提供了一系列的方法,最主要的兩個方法是<code>on</code>和<code>emit</code>,這些方法供其它類使用。

on方法接受兩個參數:需要監聽的事件的名稱和事件觸發時需要調用的函數。因為EventEmitter是接口,是以從EventEmitter繼承的類需要用<code>new</code>關鍵字來構造。

在這個例子中,我們先包含了util子產品。以便調用它的inherits方法。inherits能夠将EventEmitter類的方法添加到建立的Server類中(有關utils子產品的介紹日後補上),也就是說這樣一來所有的Server的新執行個體都能夠使用EventEmitter的方法。然後我們包含了Events子產品。但是我們隻是想調用其中的EventEmitter類,然後将它的方法綁定到要用的Server類上。

Server的執行個體能夠通路EventEmitter的方法,也就是說我們可以調用on方法為這個執行個體添加事件監聽器。到目前為止,我們添加的事件監聽器還不會被調用,因為并沒有一個叫做“eventName”的事件被觸發。

觸發事件監聽器很簡單,隻要調用emit方法就可以了。要注意的是,這些事件隻是針對某一個執行個體的,并不存在全局的事件。但你調用on方法的時候,需要将其綁定在特定的基于EventEmitter的對象上(繼承自EventEmitter的對象)。

調用emit方法時,除了第一個參數是事件的名稱外,你可以傳入任意數目的參數。這些參數都将傳遞給該監聽事件的函數。比如從HTTP伺服器接收到request請求的時候,你會接受到兩個參數:req和res。當request事件被觸發時,這些參數會作為第二個和第三個參數傳給emit函數。

前面說到的,當事件觸發時,emit方法中的第二個參數之後的所有參數都會傳遞給on方法中的回調函數。那前面的例子來說,emit方法中的參數<code>a,b,c</code>将會作為參數傳遞給on方法中的毀掉函數

emitter中的内容:

輸出結果 :

emitter.once(event, listener)

添加一個

一次性監聽器,這個監聽器隻會在下一次事件發生時被觸發一次,觸發完成後就被删除。

emitter.addListener(event, listener)

添加一個監聽器至特定事件的監聽器數組尾部,和on方法一樣,但是on方法沒有與之對應的removeListener方法。

emitter.removeListener(event, listener)

從一個事件的監聽器數組中删除一個監聽器注意:此操作會改變監聽器 數組中目前監聽器後的所有 監聽器在的下标。

關于addListener和removeListener,可以結合一下DOM中的addEventListener和removeEventListener方法來了解。

更多詳細的介紹請看

最近在github上fork了若幹個國外的開源項目,比較小巧的項目。但是遇到了障礙,語言不通啊!!!!!!英語太菜啊!!!!!!光看得懂文檔有毛線用啊!!!!!要了解思維方式啊!!!

默默努力吧,加油!