筆記-Nodejs中的核心API之Events

最近正在學習Node,在圖書館借了基本關於Node的書,同時在網上查閱資料,很有收穫,可是總體感受對Node的理解仍是停留在一個很模棱兩可的狀態。好比Node中的模塊,平時練習就接觸到那麼幾個,其餘的一些模塊暫時只會在學習的時候接觸到,不經常使用便就荒廢了。正所謂好記心不如爛筆頭,多作筆記仍是更有利於理解和記憶。本身作的總結也方便回頭複習,因此決定踏上漫長的修煉之旅……html

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

Events

幾乎全部的模塊都是創建在Event模塊的基礎上誕生的,而Event模塊只提供了一個對象:events.EventEmitter,其核心功能就是事件發射和事件監聽功能的封裝。git

EventEmitter

Node建立了一個EventEmitter類提供基礎的事件功能,全部的Node的事件功能都圍繞着EventEmitter,由於它的設計包含了其餘類拓展所須要的接口類。EventEmitter的每個事件由一個事件名和若干個參數組成,事件名是一個字符串,一般表達必定的語義。每個事件都支持若干個事件監聽器。當事件發射時,註冊的事件監聽器一次被調用,同時參數做爲回調函數的參數傳遞要注意,一般不會直接調用EventEmitter對象,咱們能夠經過 require('events').EventEmitter 獲取 EventEmitter 類。github

EventEmitter提供了一系列的方法,最主要的兩個方法是onemit,這些方法供其它類使用。api

使用on方法監聽事件

on方法接受兩個參數:須要監聽的事件的名稱和事件觸發時須要調用的函數。由於EventEmitter是接口,因此從EventEmitter繼承的類須要用new關鍵字來構造。數組

//建立一個新的類支持EventEmitter事件
var util = require("util"),
    EventEmitter = require("events").EventEmitter;
    
var Server = function(){
    console.log("init");
};

util.inherits(Server, EventEmitter);

var s = new Server();

s.on("eventName", function(){
    console.log("eventName : abc");
});

在這個例子中,咱們先包含了util模塊。以便調用它的inherits方法。inherits可以將EventEmitter類的方法添加到建立的Server類中(有關utils模塊的介紹往後補上),也就是說這樣一來全部的Server的新實例都可以使用EventEmitter的方法。而後咱們包含了Events模塊。可是咱們只是想調用其中的EventEmitter類,而後將它的方法綁定到要用的Server類上。服務器

Server的實例可以訪問EventEmitter的方法,也就是說咱們能夠調用on方法爲這個實例添加事件監聽器。到目前爲止,咱們添加的事件監聽器還不會被調用,由於並無一個叫作「eventName」的事件被觸發。函數

使用emit方法觸發事件

s.emit("eventName",a,b,c);

觸發事件監聽器很簡單,只要調用emit方法就能夠了。要注意的是,這些事件只是針對某一個實例的,並不存在全局的事件。但你調用on方法的時候,須要將其綁定在特定的基於EventEmitter的對象上(繼承自EventEmitter的對象)。學習

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

回調函數

前面說到的,當事件觸發時,emit方法中的第二個參數以後的全部參數都會傳遞給on方法中的回調函數。那前面的例子來講,emit方法中的參數a,b,c將會做爲參數傳遞給on方法中的毀掉函數

emitter 中的內容:

// write by 張小倫愛學習
 
var util = require("util"),
    EventEmitter = require("events").EventEmitter;
    
var Server = function(){
    console.log("init");
};

util.inherits(Server, EventEmitter);

var s = new Server();

s.on("eventName", function(para1,para2,para3){
    console.log("eventName : abc");
    console.log("para1 : "+para1);
    console.log("para2 : "+para2);
    console.log("para3 : "+para3);
});

s.emit("eventName","a","b","c");

輸出結果

init                //建立一個Server實例
eventName : abc     //on方法中的回調函數
para1 : a
para2 : b
para3 : c

更多方法

emitter.once(event, listener)
添加一個 一次性監聽器,這個監聽器只會在下一次事件發生時被觸發一次,觸發完成後就被刪除。

emitter.addListener(event, listener)
添加一個監聽器至特定事件的監聽器數組尾部,和on方法同樣,可是on方法沒有與之對應的removeListener方法。

emitter.removeListener(event, listener)
從一個事件的監聽器數組中刪除一個監聽器注意:此操做會改變監聽器 數組中當前監聽器後的全部 監聽器在的下標。

關於addListener和removeListener,能夠結合一下DOM中的addEventListener和removeEventListener方法來理解。

更多詳細的介紹請看這裏

結束語

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

默默努力吧,加油!

相關文章
相關標籤/搜索