欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

參考?EventEmitter實現一個簡單的訂閱發(fā)布功能函數

 更新時間:2023年02月12日 15:21:18   作者:拾光者  
這篇文章主要為大家介紹了參考?EventEmitter實現一個簡單的訂閱發(fā)布功能函數示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

目的

訂閱發(fā)布模式 應該是 JS 最常用的設計模式,也可稱之為 觀察者模式,前端各個方面都會涉及到它,比如:瀏覽器中的事件監(jiān)聽機制、nodejs 中的 EventEmitter 、redux 數據傳遞實現等等。

不管是 瀏覽器中的事件監(jiān)聽機制 還是 nodejs 中的 EventEmitter,都只能在各自的環(huán)境進行運行。因此我們需要用一份代碼來讓多端都可以調用,EventEmitter 功能更全面,我們借鑒它來實現一個完整的 PubSub。

實現

主要參考 EventEmitter 的功能來,本篇文章提供 簡單實現,下一篇提供了 完整實現,點擊即可去查看,代碼有問題歡迎評論區(qū)指出。

實現常用功能:

  • on : 用于添加訂閱
  • off : 用于取消訂閱
  • once : 用于添加一次性訂閱
  • emit : 用于發(fā)布事件,讓訂閱者收到通知

完整代碼實現:

type Listener = (...args: any[]) => void;
type EventInfo = {
  // 監(jiān)聽器
  listener: Listener;
  // 備份,需要改變 listener 時,則需要備份,比如 once
  bak?: Listener;
};
// 創(chuàng)建一次性監(jiān)聽器
function createOnceListener(pub: PubSub, eventName: string | symbol, listener: Listener) {
  const onceListener = (...args: any[]) => {
    // 執(zhí)行一次后直接取消訂閱
    listener(...args);
    pub.off(eventName, listener);
  };
  return onceListener;
}
export class PubSub {
  private eventMap: Record<string | symbol, EventInfo[]> = {};
  // 訂閱
  on = (eventName: string | symbol, listener: Listener) => {
    if (!this.eventMap[eventName]) {
      this.eventMap[eventName] = [];
    }
    this.eventMap[eventName].push({ listener });
    return this;
  };
  // 取消訂閱
  off = (eventName: string | symbol, listener: Listener) => {
    if (this.eventMap[eventName]) {
      this.eventMap[eventName] = this.eventMap[eventName].filter((item) => {
        // once listener 取消訂閱
        if (item.bak) {
          return item.bak !== listener;
        }
        // 正常 listener 取消訂閱
        return item.listener !== listener;
      });
    }
    return this;
  };
  // 類似 EventEmitter 中的 emit 函數
  emit = (eventName: string | symbol, ...args: any[]) => {
    this.eventMap[eventName]?.forEach((item) => {
      item.listener(...args);
    });
    return this;
  };
  // 只訂閱一次
  once = (eventName: string | symbol, listener: Listener) => {
    const onceListener = createOnceListener(this, eventName, listener);
    this.on(eventName, onceListener);
    return this;
  };
}
// 不需要有全局訂閱功能的,可以去掉這個
export const pubSub = new PubSub();

實現說明:

  • 不管訂閱還是發(fā)布的時候都需要判讀是否有已存在的隊列。
  • eventMap 用于存儲訂閱相關信息。
  • once 使用 createOnceListener 函數實現,給原listener 添加一層包裹,執(zhí)行一次后自動注銷。
  • off 注銷監(jiān)聽時需要考慮 oncelistener 被添加了一層包裹,需要用備份的原始 listener 來判斷。
  • listener 函數需要考慮有多個參數。
  • 操作性的函數的返回值為 this,用于鏈式調用,比如 pubSub.emit("test").off("test")

總結

實現過程是通過閱讀 EventEmitter 官方文檔的 API 來進行反向實現的,typescript 類型可以直接通過 nodejs 使用的時候獲取,這也一般是想實現某一個功能的方法。

有不對的地方歡迎指出,感謝??。

點擊查看下一篇 完整實現

以上就是參考 EventEmitter實現一個簡單的訂閱發(fā)布功能函數的詳細內容,更多關于EventEmitter訂閱發(fā)布功能函數的資料請關注腳本之家其它相關文章!

相關文章

  • windows系統(tǒng)上完全卸載并重裝Node的步驟(親測可用)

    windows系統(tǒng)上完全卸載并重裝Node的步驟(親測可用)

    對于Windows平臺來說,所有的應用程序,其安裝卸載都是一樣的,node.js也不例外,但是還是很多用戶不明白,下面這篇文章主要給大家介紹了關于windows系統(tǒng)上完全卸載并重裝Node的步驟,需要的朋友可以參考下
    2023-03-03
  • nodejs中全局變量的實例解析

    nodejs中全局變量的實例解析

    本文主要介紹了nodejs中全局變量的相關知識,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • 原生node.js案例--前后臺交互

    原生node.js案例--前后臺交互

    本文主要介紹了原生node.js案例--前后臺交互。本案例包含4部分:(1)HTML部分;(2)ajax部分;(3)JavaScript部分;(4)node服務器部分。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • 從零學習node.js之簡易的網絡爬蟲(四)

    從零學習node.js之簡易的網絡爬蟲(四)

    簡單的爬蟲實現原理很簡單:發(fā)送http請求至目標地址獲取HTML頁面數據,然后從獲取來的頁面數據中提取需要的數據保存。下面這篇文章主要介紹了利用node.js實現簡易的網絡爬蟲的相關資料,需要的朋友可以參考下。
    2017-02-02
  • 使用Express+Node.js對mysql進行增改查操作?

    使用Express+Node.js對mysql進行增改查操作?

    這篇文章主要介紹了使用Express+Node.js對mysql進行增改查操作,文章圍繞主題展開詳細的內容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • koa2實現登錄注冊功能的示例代碼

    koa2實現登錄注冊功能的示例代碼

    這篇文章主要介紹了koa2實現登錄注冊功能的示例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • nodeJS模塊簡單用法示例

    nodeJS模塊簡單用法示例

    這篇文章主要介紹了nodeJS模塊簡單用法,結合實例形式簡單分析了nodejs模塊定義、引入、注冊、啟動等相關操作技巧,需要的朋友可以參考下
    2018-04-04
  • Node.js v8.0.0正式發(fā)布!看看帶來了哪些主要新特性

    Node.js v8.0.0正式發(fā)布!看看帶來了哪些主要新特性

    Node.js v8.0.0 已正式發(fā)布。v8.0.0 是下一個主要的版本,帶來了一系列重大的變化和新功能,內容十分多!下面這篇文章主要帶著大家一起看看Node.js v8.0.0帶來了哪些主要新特性,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-06-06
  • 零基礎實現node+express個性化聊天室的示例

    零基礎實現node+express個性化聊天室的示例

    這篇文章主要介紹了零基礎實現node+express個性化聊天室的示例,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-02-02
  • Puppeteer環(huán)境搭建的詳細步驟

    Puppeteer環(huán)境搭建的詳細步驟

    這篇文章主要介紹了Puppeteer環(huán)境搭建的詳細步驟,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-09-09

最新評論