有趣的Nodejs模組之events

2021-10-02 02:43:56 字數 2833 閱讀 2287

nodejs 使用了乙個事件驅動、非阻塞 io 的模型。events模組是事件驅動的核心模組。很多內建模組都繼承了events.eventemitter

自己無需手動實現這種設計模式,直接繼承eventemitter即可。**如下:

const  = require("events");

class

myemitter

extends

eventemitter

{}const ins = new myemitter();

ins.on("test", () => );

ins.emit("test");

根據文件,應該 eventemitter 例項的error事件是個特殊事件。推薦做法是:在建立例項後,應該立即註冊error事件。

const ins = new myemitter();

ins.on("error", error => );

註冊error事件後,我原本的理解是,所有事件回掉邏輯中的錯誤都會在 eventemitter 內部**獲,並且在內部觸發error事件。

也就是說下面**,會列印:"error msg is a is not defined"。

ins.on("test", () => );

ins.emit("test");

然而,錯誤並沒有捕獲,直接丟擲了異常。由此可見,eventemitter 在執行內部邏輯的時候,並沒有try-catch。簡單來講,error 和 exception 並不完全一樣。

如果按照正常想法,不想每一次都在外面套一層try-catch,那應該怎麼做呢?我的做法是在

eventemitter 原型鏈上新增乙個safeemit函式。

eventemitter.prototype.safeemit = function(name, ...args)  catch (error) 

};

如此一來,執行前一段**的 exception 就會**獲到,並且觸發error事件。前一段**的輸出就變成了:

error msg is a is not defined
對於同乙個事件,觸發它的時候,函式的執行順序就是函式繫結時候的順序。官方庫提供了emitter.prependlistener()emitter.prependoncelistener()兩個介面,可以讓新的***直接新增到佇列頭部。

但是如果想讓新的***放入任何***佇列的任何位置呢?在原型鏈上封裝了insertlistener方法。

eventemitter.prototype.insertlistener = function(name,

index,

callback,

once = false

) // 正常***,直接是 function

const listeners = ins.rawlisteners(name);

const that = this;

// 下標不合法

if (index > listeners.length || index < 0)

// 繫結***數量已達上限

if (listeners.length >= this.getmaxlisteners())

listeners.splice(index, 0, once ? : callback);

this.removealllisteners(name);

listeners.foreach(function(item) else = item;

that.once(name, listener);

}});

return

true;

};

使用起來,效果如下:

const ins = new myemitter();

ins.on("error", error => );

ins.on("test", () => );

ins.on("test", () => );

// ***佇列中插入新的***,乙個是once型別,乙個不是once型別

ins.insertlistener(

"test",

0,() => ,

true

);ins.insertlistener("test", 1, () => );

連續呼叫兩次ins.emit("test"),結果輸出如下:

# 第一次

once test insert

test insert

test 1

test 2

# 第二次: once 型別的***呼叫一次後銷毀

test insert

test 1

test 2

在繫結事件***的時候,如果***沒有被 remove,那麼存在記憶體洩漏的風險。

我知道的常見做法如下:

專注前端與演算法的系列乾貨分享,歡迎關注(¬‿¬)

NodeJs 之模組系統

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

Nodejs資料之nodemon模組

模組作用 nodemon是乙個命令列工具,用以輔助專案開發。在node.js中,可以在每次修改檔案後重新執行該檔案。使用步驟 f workstation nodejs npm install nodemon g在命令列工具中用nodemon命令替代node命令執行檔案 f workstation n...

Nodejs學習之Path模組

node.js path模組提供了一些用於處理檔案路徑的方法 引入path模組 var path require path 格式化路徑 console.log normalization path.normalize test test1 lynnlee teemo picaq 列印結果 norma...