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...