91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Node.js的Events模塊怎么使用

發布時間:2021-12-27 18:08:11 來源:億速云 閱讀:142 作者:iii 欄目:web開發

本篇內容主要講解“Node.js的Events模塊怎么使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Node.js的Events模塊怎么使用”吧!

Node.js的Events模塊怎么使用

Events模塊

參考官網:events 事件觸發器 | Node.js

http://nodejs.cn/api/events.html

Events 模塊是Node最重要的模塊,它提供了一個屬性 EventEmitterEventEmitter 的核心是事件發射與事件監聽器。

Node中大部分的模塊,都繼承自 Events 模塊。

  • Events 模塊是Node對 發布訂閱模式publish/subscribe)的實現。一個對象通過這個模塊,向另一個對象傳遞消息。

  • 該模塊通過 EventEmitter 屬性,提供了一個構造函數。該構造函數的實例具有 on 方法,可以用來監聽指定事件,并觸發回調函數。

  • 任意對象都可以發布指定事件,被 EventEmitter 實例的on方法監聽到。

發布訂閱模式

關于 發布訂閱模式 ,可以參考我之前的博客文章。

關于 Events 中的發布訂閱模式,我們要先清楚它的幾個常用方法。

  • 訂閱方法on 方法用來訂閱事件,訂閱是將方法對應成一種一對多的關系。

  • 發布方法emit 用來執行訂閱的事件。

  • 取消訂閱off 方法可以移除對應的事件監聽。

  • 訂閱一次once 綁定事件當執行后自動刪除訂閱的事件。

on 和 emit

on 方法的第一個參數用來設定類名,第二個參數也是一個函數,里面可以接收發布時傳入的參數。

emit 方法第一個參數是類名,之后的參數都是傳入 on 方法函數中的參數。

onemit 具體應用可以參考下面這個簡單的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);

現在我們可以實現一套 onemit 方法。

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);

這樣我們可以根據之前實現的 onoff 來實現此方法。

// 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模塊怎么使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

临潭县| 建阳市| 收藏| 蕉岭县| 茌平县| 新密市| 射阳县| 治多县| 嘉禾县| 娄烦县| 绥宁县| 天柱县| 嘉荫县| 全州县| 中超| 石楼县| 青岛市| 玛沁县| 巴林左旗| 通化县| 彰武县| 保康县| 梓潼县| 桑日县| 甘肃省| 五寨县| 托克逊县| 新河县| 湟中县| 田阳县| 清丰县| 沂南县| 吉林省| 瓮安县| 林甸县| 行唐县| 万安县| 息烽县| 绥棱县| 惠来县| 平定县|