最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

參考?EventEmitter實(shí)現(xiàn)一個簡單的訂閱發(fā)布功能函數(shù)

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

目的

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

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

實(shí)現(xiàn)

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

實(shí)現(xiàn)常用功能:

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

完整代碼實(shí)現(xiàn):

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 函數(shù)
  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();

實(shí)現(xiàn)說明:

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

總結(jié)

實(shí)現(xiàn)過程是通過閱讀 EventEmitter 官方文檔的 API 來進(jìn)行反向?qū)崿F(xiàn)的,typescript 類型可以直接通過 nodejs 使用的時候獲取,這也一般是想實(shí)現(xiàn)某一個功能的方法。

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

點(diǎn)擊查看下一篇 完整實(shí)現(xiàn)

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

相關(guān)文章

  • Node.js fs模塊原理及常見用途

    Node.js fs模塊原理及常見用途

    這篇文章主要介紹了Node.js fs模塊原理及常見用途,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • centos 上快速搭建ghost博客方法分享

    centos 上快速搭建ghost博客方法分享

    本文給大家分享的是如何在centos上快速搭建基于Node.js 構(gòu)建的開源博客平臺ghost的方法,非常的實(shí)用,有需要的小伙伴可以參考下
    2018-05-05
  • node.JS的crypto加密模塊使用方法詳解(MD5,AES,Hmac,Diffie-Hellman加密)

    node.JS的crypto加密模塊使用方法詳解(MD5,AES,Hmac,Diffie-Hellman加密)

    本文將詳細(xì)介紹node.JS的加密模塊crypto實(shí)現(xiàn)MD5,AES,Hmac,Diffie-Hellman加密的詳解方法,需要的朋友可以參考下
    2020-02-02
  • Node.js工具庫yeoman使用介紹

    Node.js工具庫yeoman使用介紹

    這篇文章主要為大家介紹了Node.js工具庫yeoman的使用介紹,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • Node.js創(chuàng)建HTTP文件服務(wù)器的使用示例

    Node.js創(chuàng)建HTTP文件服務(wù)器的使用示例

    我們的目的比較簡單,使用Node.js創(chuàng)建一個HTTP協(xié)議的文件服務(wù)器,你可以使用瀏覽器或其它下載工具到文件服務(wù)器上下載文件,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 淺析Node.js:DNS模塊的使用

    淺析Node.js:DNS模塊的使用

    本篇文章主要介紹了Node.js:DNS模塊的使用,DNS模塊包涵有關(guān)DNS查詢和操作的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
    2016-11-11
  • 在Node.js中執(zhí)行解壓縮文件操作方法

    在Node.js中執(zhí)行解壓縮文件操作方法

    本文主要介紹了如何在Node.js中進(jìn)行解壓縮文件操作,本文也提供了壓縮文件的方法,壓縮文件的文件路徑需要對應(yīng)自己要壓縮的文件夾路徑,通過本文的介紹,可以幫助讀者更好地理解和使用Node.js進(jìn)行解壓縮文件操作
    2024-10-10
  • node.js回調(diào)函數(shù)之阻塞調(diào)用與非阻塞調(diào)用

    node.js回調(diào)函數(shù)之阻塞調(diào)用與非阻塞調(diào)用

    本文重點(diǎn)給大家介紹node.js回調(diào)函數(shù)之阻塞調(diào)用和非阻塞調(diào)用,涉及到node.js回調(diào)函數(shù)的相關(guān)知識,對本文感興趣的朋友一起學(xué)習(xí)吧
    2015-11-11
  • npm鏡像源證書過期的問題解決

    npm鏡像源證書過期的問題解決

    因?yàn)閚pm官方鏡像在國內(nèi)訪問很慢,我們基本上都會選擇切換到國內(nèi)的一些npm鏡像,本文主要介紹了npm鏡像源證書過期的問題解決,具有一定的參考價值,感興趣的可以了解一下
    2024-07-07
  • node.js中路由,中間件,get請求和post請求的參數(shù)詳解

    node.js中路由,中間件,get請求和post請求的參數(shù)詳解

    本文給大家匯總介紹了node.js中的路由,中間件,get請求和post請求的參數(shù)的使用方法,非常的詳細(xì),有需要的小伙伴可以參考下
    2017-12-12

最新評論

峨眉山市| 太湖县| 大宁县| 读书| 会昌县| 托克逊县| 蓬溪县| 哈尔滨市| 奉贤区| 甘南县| 呼和浩特市| 佛教| 北海市| 新沂市| 大理市| 突泉县| 武汉市| 工布江达县| 新巴尔虎右旗| 武汉市| 湘西| 云阳县| 霸州市| 万载县| 栾川县| 精河县| 安徽省| 米易县| 中牟县| 枣庄市| 永寿县| 兴城市| 宾川县| 厦门市| 蚌埠市| 桦南县| 潜山县| 承德市| 申扎县| 灵山县| 石家庄市|