nodeJS之eventproxy原始碼解讀

2022-02-12 21:55:26 字數 2880 閱讀 7840

1.原始碼縮影

原始碼解讀: 上面大致展示了eventproxy的結構,首先它使用閉包的形式保證了**的整潔;其次為了適應不同的使用場合,**中都做了必要的處理,而我們使用最多的無疑是作為nodejs的模組:檢查exports,如果存在,則構建為nodejs模組:module.exports = definition(require(『debug』)(『eventproxy』));而definition則是function(debug)開始一直到檔案結構的函式,其中debug作為除錯,暫且不管,剩下的就是eventproxy函建構函式,eventproxy原型函式,eventproxy.create一般函式,最後返回eventproxy函建構函式.於是構建的結果相當於module.exports = eventproxy;所以在其它模組中的require(「eventproxy」)指向的就是eventproxy建構函式.

2.原型函式addlistener,別名bind,on,subscribe

eventproxy.prototype.addlistener =function(ev,callback);

原始碼解讀: 該方法接收兩個引數:事件名稱和**函式,首先在_callbacks物件上面開闢事件的陣列,之後把**函式放進該陣列中.

3.原型函式headbind

eventproxy.prototype.headbind =function(ev,callback);

原始碼解讀: 該方法與addlistene方法相同,只不過是把**函式放在了陣列的第乙個

4.原型函式removelistener,別名unbind

eventproxy.prototype.removelistener =function(eventname,callback);}elseelse}}}}returnthis;};

原始碼解讀: 該方法是為移除特定的**函式:(1)兩個引數都不存在,移除所有**函式(2)eventname存在,callback不存在,移除eventname上的所有函式(3)eventname存在,callback存在,移除eventname上的callback函式.

5.原型函式removealllisteners

eventproxy.prototype.removealllisteners =function(event);

原始碼解讀: 該方法是為移除event上所有的函式.

6.原型函式bindforall

eventproxy.prototype.bindforall =function(callback);

原始碼解讀: 該方法是為繫結全域性**函式 all為callback

7.原型函式unbindforall

eventproxy.prototype.unbindforall =function(callback);

原始碼解讀: 該方法是為移除全域性**函式all的callback函式

8.原型函式trigger,別名emit,fire

原始碼解讀: 該方法是為eventname事件觸發函式,或對eventname事件注值函式:(1)事件觸發會做兩件事情,一是觸發該事件的函式陣列,把data出入一一執行,二是執行全域性**函式陣列,把事件名稱和data傳進去,它內部會判斷是否所有要處理的事件都已處理完畢,處理完畢就執行後面真正的全域性**,如果沒有完成則會退出全域性**函式.

9.原型函式once

原始碼解讀: 該方法是為一次性繫結函式,即**之後會移除,是最常用的繫結函式,它繫結的不是原有**函式,而是進行了包裝,因為在包裝內部要做解綁處理;雖然進行了包裝,但是**的時候傳入的引數還是在內部傳入遠**函式執行,只是多了一步解綁.

10.臨時變數later

varlater =typeofprocess !=='undefined'&&process.nexttick ||function(fn);

原始碼解讀: 存在process.nexttick,later就等於process.nexttick,沒有就用settimeout.

11.原型函式emitlater

原始碼解讀: 遲緩觸發,引數應為eventname,data.

12.原型函式immediate,別名asap

eventproxy.prototype.immediate =function(ev,callback,data);

原始碼解讀: 即時的,繫結事件**函式,觸發

13.臨時變數_assign

var_assign =function(eventname1,eventname2,cb,once);//已觸發注值標誌// check the arguments length.if(argslength <3)varevents =slice.call(arguments,0,-2);//取得傳入的event陣列varcallback =arguments[argslength -2];//取得**函式varisonce =arguments[argslength -1];//取得是否一次呼叫標誌// check the callback type.if(typeofcallback !=="function")debug('assign listener for events %j, once is %s',events,!!isonce);varbind =function(key);//初始化結果儲存位置proxy._fired[key].data =data;//把資料注入_fired中if(!flag[key]){//沒有**過,標誌置為true,事件**個數+1flag[key

NodeJs 之模組系統

隨著前端的發展,工程模組兒化已經是必不可少的一部分了,為了讓nodejs的檔案可以相互呼叫,nodejs提供了乙個簡單的模組系統 簡單點說 乙個nodejs檔案就是乙個模組兒 通過 來實踐認識一下,建立乙個模組兒,上邊我們說到乙個nodejs檔案就是乙個模組兒,那麼建立乙個模組兒其實就是建立乙個no...

Nodejs之querystring 查詢字串

querystring 模組提供了一些實用函式,用於解析 與格式化url查詢字串 使用方法如下 const querystring require querystring 匯入node內建模組 querystring.escape str str 對給定的str進行url編碼 該方法是提供給quer...

前端 nodejs之cookie入門

set cookie cookiename cookievalue expires domain path secure httponly 引數說明 1 expires 指定過期時間,以gmt格式表示的時間字串,如方法乙個的 timeobj 2 maxage 指定過期時間,同expires expi...