您好,登錄后才能下訂單哦!
本篇內容主要講解“Node.js的Events模塊怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Node.js的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
方法函數中的參數。
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
方法的第一個參數用來設定類名,第二個參數傳入需要被移除的函數回調。
// ... 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
方法的第一個參數用來設定類名,第二個參數傳入只需要執行一次的函數回調。
// ... 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.js的Events模塊怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。