EventBus的實現

EventBus概要

EventBus是消息傳遞的一種方式,基于一個消息中心,訂閱和發布消息的模式。這種方式的實現不僅僅局限于前端,在iOS中的消息消息中心也是如此實現。

  1. 設計模式:訂閱者發布者模式,這種設計模式在前端很常見。
  2. API的設計:

    2.1 只能構造一個消息對象

    2.2 on('msgName', func)訂閱消息,msgName:訂閱的消息名稱 func: 訂閱的消息

    2.3 one('msgName', func)僅訂閱一次消息,后訂閱的會替換前面訂閱的消息

    2.4 emit('msgName', msg)發布消息 msgName:消息名稱 msg:發布的消息

    2.5 off('msgName')移除消息

實現EventBus

// 構造EventBus
function EventBusClass() {this.msgQueues = {}
}EventBusClass.prototype = {// 將消息保存到當前的消息隊列中on: function(msgName, func) {if (this.msgQueues.hasOwnProperty(msgName)) {if (typeof this.msgQueues[msgName] === 'function') {this.msgQueues[msgName] = [this.msgQueues[msgName], func]                } else {this.msgQueues[msgName] = [...this.msgQueues[msgName], func]    }} else {this.msgQueues[msgName] = func;}},// 消息隊列中僅保存一個消息one: function(msgName, func) {// 無需檢查msgName是否存在this.msgQueues[msgName] = func;},// 發送消息emit: function(msgName, msg) {if (!this.msgQueues.hasOwnProperty(msgName)) {return}if (typeof this.msgQueues[msgName] === 'function') {this.msgQueues[msgName](msg)} else {this.msgQueues[msgName].map((fn) => {fn(msg)})}},// 移除消息off: function(msgName) {if (!this.msgQueues.hasOwnProperty(msgName)) {return}delete this.msgQueues[msgName]}
}// 將EventBus放到window對象中
const EventBus = new EventBusClass()
window.EventBus = EventBus

使用EventBus

// 訂閱消息
function subscribe() {EventBus.on('first-event', function(msg) {alert(`訂閱的消息是:${msg}`);});
}// 發送消息
function emit() {const msgInput = document.getElementById("msgInputId")EventBus.emit('first-event', msgInput.value)
}// 移除消息
function off(msgName) {EventBus.off(msgName)
}

CodePen預覽

CodePen預覽

-----可能需要翻墻-----

<p data-height="265" data-theme-id="0" data-slug-hash="maQpgR" data-default-tab="js,result" data-user="beyondverage0908" data-pen-title="EventBus的實現" style="height: 265px; box-sizing: border-box; display: flex; align-items: center; justify-content: center; border: 2px solid black; margin: 1em 0; padding: 1em;" class="codepen"><span>See the Pen EventBus的實現 by avg (@beyondverage0908) on CodePen.</span></p>
<script async src="https://static.codepen.io/ass...;></script>

總結

整個EventBus主要部分是分為三個部分。消息中心,訂閱事件方法,發布消息方法。雖然不能和Vue中實現的那么全面,但麻雀雖小,五臟俱全。缺少的部分在于對數據安全性的校驗。希望給你一個實現的思路

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/280636.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/280636.shtml
英文地址,請注明出處:http://en.pswp.cn/news/280636.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Django05-1: 有名分組、無名分組與反向解析

有名、無名分組 分組正則表達式&#xff0c;加小括號 url(r^test/(\d), views.test),def test(request,xx):print(xx)return HttpResponse("OK") 無名分組 將括號正則表達式匹配的內容&#xff0c;當作位置參數傳遞到后面的視圖函數 有名分組 正則表達式起一個別…

Django的第一步(第一節)

寫下你的第一個Django應用第一部分讓我們通過例子來學習.在本教程中&#xff0c;我們將引導您完成基本投票應用程序的創建.其中包括兩部分:一個讓人們查看民意調查并投票的公共網站.允許您添加&#xff0c;更改和刪除民意調查的管理網站.我們假設你django已經安裝好了,你可以通…

ad中電源插座怎么封裝_您可以在房屋中安裝的各種電源插座

ad中電源插座怎么封裝You may already know about smart outlets, or outlets with integrated USB ports. But you might be surprised at how many “normal” outlets you can actually buy for your house. They’re all built for different situations, and you want to …

Arithmetic Slices

這兩天一直復習動態規劃&#xff0c;就想到leetcode上刷刷題&#xff0c;easy難度的很少&#xff0c;大部分都是medium和hard。本題是第一道DP類型medium難度的題目&#xff0c;但是用其他的方法比如暴力法也可以求解。首先來看題目描述&#xff1a; A sequence of number is c…

在Data Lake Analytics中使用視圖

在Data Lake Analytics中使用視圖 1. 概述 在Data Lake Analytics&#xff08;以下簡稱DLA&#xff09;中使用視圖&#xff08;VIEW&#xff09;功能&#xff0c;可以大大簡化對于重復SQL&#xff0c;特別是較為復雜的SQL語句的編寫和維護。目前DLA中還不支持SQL視圖的物化。在…

C# 實例詳解委托之Func、Action、delegate(精品)

概述委托是.NET編程的精髓之一&#xff0c;在日常編程中經常用到&#xff0c;在C#中實現委托主要有Func、Action、delegate三種方式&#xff0c;本節主要就這三種委托的用法通過實例展開講解。Func用法解析【Func】&#xff1a;Func是帶返回值的委托&#xff1a;原型函數如下(以…

Django05-2:路由分發/命名空間/偽靜態/虛擬環境/django版本區別

路由分發 補充&#xff1a;每一個應用可以有獨立的templates模板文件夾&#xff0c;static靜態文件加&#xff0c;urls.py 總路由 #方法一from app01 import urls as app01_urls from app02 import urls as app02_urlsurlpatterns [url(r^publisher_list/, views.publisher_…

Word中查找替換軟回車鍵和回車鍵

在Word中使用搜索功能搜索“^p”組合字符串可以查找文檔中的所有換行符&#xff08;回車鍵&#xff09;&#xff0c;使用“^l”&#xff08;英文輸入狀態下shift6與小寫字符L的組合&#xff09;可以搜索所有的軟回車符。使用替換功能就可以搜索替換二者。轉載于:https://www.cn…

minecraft服務器_如何使用Minecraft領域設置簡單的無壓力Minecraft服務器

minecraft服務器There are a lot of ways to go about hosting a Minecraft game but it’s tough to beat the simplicity of buying a server directly from Mojang, the company behind Minecraft (and now it even comes with a free 30 day trial!) Read on as we show yo…

自動化測試基礎篇--Selenium瀏覽器操作

Selenium 主要提供的是操作頁面上各種元素的方法&#xff0c;但它也提供了操作瀏覽器本身的方法&#xff0c;比如瀏覽器的大小以及瀏覽器后退、前進按鈕等。一、控制瀏覽器窗口大小有時候我們希望能以某種瀏覽器尺寸打開&#xff0c;讓訪問的頁面在這種尺寸下運行。例如可以將瀏…

Sublime text3配置xdebug調試記錄

第一次配置遇到的問題記錄&#xff1b; 問題&#xff1a;配置php.ini的時候xdebug.remote_port 9001剛開始我一直配置9000端口沖突,然后一切弄好了訪問瀏覽器就一直在轉圈無法訪問&#xff1b; 現在開始配置&#xff1a; 1.打開sublime 輸入install Package如下顯示在按回車&a…

.NET Conf China 2022 今天(12.4) 日程一覽

點擊藍字關注我們.NET Conf China 2022 誠邀您的加入立即掃碼預約加入.NET年度盛宴&#xff01;&#xff01;CSDN 直播https://bbs.csdn.net/forums/DotNET?typeId20680 思否直播https://segmentfault.com/area/dotnetconf-2022主論壇分論壇前端專場-A會場出品人&#xff1a;張…

移動web開發適配rem

移動的meta標簽 <meta name"viewport" content"widthdevice-width, initial-scale1,user-scalableno"> 常見移動web適配方法&#xff1a; 1.定高&#xff0c;百分比布局 2.flex布局 3.media媒體查詢 rem&#xff08;font size of the root element…

Django06:視圖層/上傳文件/request 方法補充/FBV與CBV

三板斧 HttpResponse, 返回字符串類型render, 返回html頁面&#xff0c;而且在返回給瀏覽器之前&#xff0c;可以給html文件傳值redirect 重定向 總結&#xff1a;視圖函數必須返回一個HttpResponse對象&#xff0c; 查看源代碼能發現。 JsonResponse對象 json用途&#x…

《Java核心技術 卷Ⅱ 高級特性(原書第10版)》一2.4.6 為克隆使用序列化

2.4.6 為克隆使用序列化 序列化機制有一種很有趣的用法&#xff1a;即提供了一種克隆對象的簡便途徑&#xff0c;只要對應的類是可序列化的即可。其做法很簡單&#xff1a;直接將對象序列化到輸出流中&#xff0c;然后將其讀回。這樣產生的新對象是對現有對象的一個深拷貝&…

談談ASP.NET Core過濾器和中間件的區別

什么是中間件中間件Middleware是所有請求都會執行的,適合用在權限校驗,一些公用字段處理,例如分頁信息獲取.asp.net core 提供了IApplicationBuilder接口來讓把中間件注冊到asp.net的管道請求當中去&#xff0c;中間件是一個典型的AOP應用。下面是一個微軟官方的一個中間件管道…

11 個 Nginx 參數性能優化工作

工作上&#xff0c;需要配置 Nginx&#xff0c;要投入生產使用&#xff0c;做了一點優化工作&#xff0c;加上以前也經常折騰 Nginx&#xff0c;故記下一些優化工作。 優化 Nginx 進程數量 配置參數如下&#xff1a; worker_processes 1; # 指定 Nginx 要開啟的進程數&#xff…

如何在Windows 8中將舊控制面板添加到Metro Start屏幕

By default there is no way to easily access the old Control Panel in Windows 8, in order to get to it you have to go through the new Metro Control Panel or switch to Explorer. Here’s how to create your own tile for it. 默認情況下&#xff0c;無法輕松訪問Wi…

vue子父組件間傳值

父組件傳值給子組件 props方式   父組件上1處聲明傳遞的鍵并賦值&#xff0c;子組件2處使用props接收一下這個鍵就可以使用了。在父組件改變這個值的話子組件跟著一起響應&#xff0c;子組件改變這個值的話父組件不改變。次為響應式&#xff0c;但是也僅限于父組件的值變化子…

Django07:模板語法/標簽/inclusion_tag/模版的繼承

模板語法傳值 列表&#xff1a;l[a,b,c] 集合&#xff1a;se{‘a’,yy,ss} 元組&#xff1a;t(111,222,333) render(request.index,html,locals()) 語法規律 {{}}:變量相關 {%%}:邏輯相關 {{func}} 會自動加括號執行&#xff0c;但不支持帶參數&#xff1b; 帶參數會不…