本篇文章帶大家了解一下Node.js中的Events模組,介紹一下 Events 中的發布訂閱模式,希望對大家有幫助!
Events模組
#參考官網:events 事件觸發器| Node.js
http ://nodejs.cn/api/events.html
Events
模組是Node最重要的模組,它提供了一個屬性EventEmitter
,EventEmitter
的核心是事件發射與事件監聽器。
Node中大部分的模組,都繼承自 Events
模組。
-
Events
模組是Node對 發布訂閱模式(publish/subscribe
)的實作。一個物件透過這個模組,向另一個物件傳遞訊息。 - 這個模組透過
EventEmitter
屬性,提供了一個建構子。此建構函式的實例具有on
方法,可以用來監聽指定事件,並觸發回呼函數。 - 任意物件都可以發布指定事件,被
EventEmitter
實例的on方法監聽到。
發布訂閱模式
關於 發布訂閱模式 ,可以參考我之前的部落格文章。
關於 Events
中的發布訂閱模式,我們要先清楚它的幾個常用方法。
-
訂閱方法:
on
方法用來訂閱事件,訂閱是將方法對應成一種一對多的關係。 -
發布方法:
emit
用來執行訂閱的事件。 -
取消訂閱:
off
方法可以移除對應的事件監聽。 -
訂閱一次:
once
綁定事件當執行後自動刪除訂閱的事件。
on 和emit
on
方法的第一個參數用來設定類別名,第二個參數也是函數,裡面可以接收發佈時傳入的參數。
emit
方法第一個參數是類別名,之後的參數都是傳入 on
方法函數中的參數。
on
和 emit
具體應用可以參考下面這個簡單的Demo。
const EventEmitter = require('events'); // 自定义一个 构造函数 function Cat() {} // 原型继承 需要通过实例来调用继承方法 Object.setPrototypeOf(Cat.prototype, EventEmitter.prototype); let cat = new Cat(); const sleep = (a, b) => { console.log(a, '睡'); }; const eat = (a, b) => { console.log(b, '吃'); }; cat.on('猫咪', sleep) cat.on('猫咪', eat) setTimeout(() => { // 小胡子 吃 // 小胖仙 睡 cat.emit('猫咪', '小胖仙', '小胡子') }, 1000);
現在我們可以實作一套 on
和 emit
方法。
function EventEmitter() { this._event = {} } // on 方法 EventEmitter.prototype.on = function (eventName, callBack) { if (!this._event) { this._event = {} } if (this._event[eventName]) { this._event[eventName].push(callBack) // 相当于 {eventName:[fn1,fn2]} } else { this._event[eventName] = [callBack]; // 相当于 {eventName:[fn1]} } } // emit 方法 EventEmitter.prototype.emit = function (eventName, ...args) { this._event[eventName].forEach(fn => { fn(...args) }); }
off
off
方法的第一個參數用來設定類別名,第二個參數傳入需要移除的函數回調。
// ... setTimeout(() => { // 小胡子 吃 // 小胖仙 睡 cat.emit('猫咪', '小胖仙', '小胡子') cat.off('猫咪', sleep); // 小胡子 吃 cat.emit('猫咪', '小胖仙', '小胡子') }, 1000);
這樣我們可以大概判斷出來,移除掉和我們傳入函數相同的函數,我們很快想到 filter 方法。
// off 方法 EventEmitter.prototype.off = function (eventName, callBack) { if (this._event && this._event[eventName]) { this._event[eventName] = this._event[eventName].filter( fn => fn !== callBack && fn.c !== callBack // fn.c参考下面的once方法实现 ) } }
once
once
方法的第一個參數用來設定類別名,第二個參數傳入只需要執行一次的函數回調。
// ... const demolition =() => { console.log('拆家'); } cat.once('猫咪', demolition) setTimeout(() => { // ...... 拆家 cat.emit('猫咪', '小胖仙', '小胡子') }, 1000);
這樣我們可以根據先前實作的 on
和 off
來實作此方法。
// once 方法 EventEmitter.prototype.once = function (eventName, callBack) { const one = () => { callBack(); this.off(eventName, one); } this.on(eventName, one); }
看起來這個方法好像沒有什麼問題,執行起來也全都是正確的。
但是在一種特殊情況下的時候,還是出現了錯誤。
那種情況就是如果我們在執行 once
方法之前,就已經透過 off
方法將其移除了。
我們實作的方法就無法實作這個需求了,所以我們還需要對once
方法進行一些修改( off
方法已經處理過了) 。
新增一個自訂屬性,用來對函數進行 「快取」 。
EventEmitter.prototype.once = function (eventName, callBack) { const one = () => { // ... } one.c = callBack; // 自定义一个属性 // ... }
這樣我們就實作了 once
方法。
更多node相關知識,請造訪:nodejs 教學! !
以上是Node.js學習之聊Events模組的詳細內容。更多資訊請關注PHP中文網其他相關文章!

Node.js擅長於高效I/O,這在很大程度上要歸功於流。 流媒體匯總處理數據,避免內存過載 - 大型文件,網絡任務和實時應用程序的理想。將流與打字稿的類型安全結合起來創建POWE

Python和JavaScript在性能和效率方面的差異主要體現在:1)Python作為解釋型語言,運行速度較慢,但開發效率高,適合快速原型開發;2)JavaScript在瀏覽器中受限於單線程,但在Node.js中可利用多線程和異步I/O提升性能,兩者在實際項目中各有優勢。

JavaScript起源於1995年,由布蘭登·艾克創造,實現語言為C語言。 1.C語言為JavaScript提供了高性能和系統級編程能力。 2.JavaScript的內存管理和性能優化依賴於C語言。 3.C語言的跨平台特性幫助JavaScript在不同操作系統上高效運行。

JavaScript在瀏覽器和Node.js環境中運行,依賴JavaScript引擎解析和執行代碼。 1)解析階段生成抽象語法樹(AST);2)編譯階段將AST轉換為字節碼或機器碼;3)執行階段執行編譯後的代碼。

Python和JavaScript的未來趨勢包括:1.Python將鞏固在科學計算和AI領域的地位,2.JavaScript將推動Web技術發展,3.跨平台開發將成為熱門,4.性能優化將是重點。兩者都將繼續在各自領域擴展應用場景,並在性能上有更多突破。

Python和JavaScript在開發環境上的選擇都很重要。 1)Python的開發環境包括PyCharm、JupyterNotebook和Anaconda,適合數據科學和快速原型開發。 2)JavaScript的開發環境包括Node.js、VSCode和Webpack,適用於前端和後端開發。根據項目需求選擇合適的工具可以提高開發效率和項目成功率。

是的,JavaScript的引擎核心是用C語言編寫的。 1)C語言提供了高效性能和底層控制,適合JavaScript引擎的開發。 2)以V8引擎為例,其核心用C 編寫,結合了C的效率和麵向對象特性。 3)JavaScript引擎的工作原理包括解析、編譯和執行,C語言在這些過程中發揮關鍵作用。

JavaScript是現代網站的核心,因為它增強了網頁的交互性和動態性。 1)它允許在不刷新頁面的情況下改變內容,2)通過DOMAPI操作網頁,3)支持複雜的交互效果如動畫和拖放,4)優化性能和最佳實踐提高用戶體驗。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器

禪工作室 13.0.1
強大的PHP整合開發環境