首页 > 其他分享 >js 实现 EventBus 事件总线

js 实现 EventBus 事件总线

时间:2023-07-05 14:34:35浏览次数:50  
标签:总线 js eventName callback eventMap video time EventBus fn

 EventBus 一般用做单例,EventEmiter 一般在组件或模块内使用

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>事件管理器</title>
</head>

<body>
  <button id="id1">play 绑定1</button>
  <button id="id2">play 绑定2</button>
  <button id="id3">pause</button>
  <button id="id4">unsubcribe play1</button>
  <button id="id5">mute绑定一次</button>
  <script>
    class EventBus {
      constructor() {
        this.eventMap = {}
      }
      subcribe(eventName, callback) {
        if (this.eventMap[eventName]) {
          this.eventMap[eventName].push(callback)
        } else {
          this.eventMap[eventName] = [callback]
        }
      }
      publish(eventName, params) {
        if (this.eventMap[eventName]) {
          this.eventMap[eventName].forEach((fn) => {
            fn && fn(params)
          })
        }
      }
      unsubcribe(eventName, callback) {
        if (this.eventMap[eventName]) {
          // 注意这里一定要重新赋值
          this.eventMap[eventName] = this.eventMap[eventName].filter((fn) => fn !== callback)
          console.log(this.eventMap[eventName])
        }
      }
      once(eventName, callback) {
        // 传参在这里传入
        const cb = (params) => {
          callback && callback(params)
          // 注意这里解绑的封装后的 cb
          this.unsubcribe(eventName, cb)
        }
        // 还是调用监听事件
        this.subcribe(eventName, cb)
      }
    }

    const video = new EventBus();
    const fn = (time) => {
      console.log('play1', time)
    }
    video.subcribe('play', fn)
    video.subcribe('play', (time) => {
      console.log('play2', time)
    })
    video.subcribe('pause', (time) => {
      console.log('pause', time)
    })
    video.once('mute', (time) => {
      console.log('mute', time)
    })
    const id1 = document.getElementById('id1')
    const id2 = document.getElementById('id2')
    const id3 = document.getElementById('id3')
    id1.onclick = () => {
      video.publish('play', new Date().getTime())
    }
    id2.onclick = () => {
      video.publish('play', new Date().getTime())
    }
    id3.onclick = () => {
      video.publish('pause', new Date().getTime())
    }
    id4.onclick = () => {
      video.unsubcribe('play', fn)
    }
    id5.onclick = () => {
      video.publish('mute', new Date().getTime())
    }
  </script>
</body>

</html>

 

标签:总线,js,eventName,callback,eventMap,video,time,EventBus,fn
From: https://www.cnblogs.com/beileixinqing/p/17528430.html

相关文章

  • egg.js
    引入joi进行参数校验按照依赖:npminstalljoi基本使用:constJoi=require('joi');constaddCatalogSchema=Joi.object({catalog:Joi.string().required(),});module.exports={addCatalogSchema,};//使用constctx=this.ctx;const{catalog}=ct......
  • 给第一行单元格赋值 + WPS JS获取工作表的总行数 + WPS JS获取工作表的总行数
    戳我,了解更多相关办公的小技巧给第一行单元格赋值1、在计算机中有一种ASCII编码,其中A在计算机中的表示的数字是65,a的ascii码是97,b的ascii码是98。2、从A1到F1可以看到第一个字母在变化,第2个数字始终是1,A的ascii码是65,F的ascii码是70。3、我们定义letter=65,使letter逐渐靠近70即可。......
  • JavaScript发展历史(JS)
    JavaScript发展历史1994年,网景公司(Netscape)发布了Navigator浏览器0.9版,这是世界上第一款比较成熟的网络浏览器,轰动一时。但是这是一款名副其实的浏览器--只能浏览页面,浏览器无法与用户互动,当时解决这个问题有两个办法,一个是采用现有的语言,许他们直接嵌入网页。另一个是发明一......
  • web js 播放rtsp视频流方案
    场景需要在web端预览海康无线摄像头视频流,所以采用海康自身提供的websdk无法使用方案1rtsp流推送到应用服务器,应用服务器再通过ffmpeg推送到nginx,js再去拉流缺点:多了一层转发,造成了一定的延迟方案2通过webRTC方案,使用现有开源插件webrtc-streamerhttps://github......
  • JS实现中英文混合文字友好截取功能
    汉字和数字混合时,按照长度进行字符截取。 <script>/***JS实现中英文混合文字溢出友好截取功能*@paramtext字符串*@paramlength截取长度*/varzfc={};zfc.mixTextOverflow=function(text,length){if(text.replace(/[\u4e00-\u9fa5]/g,'aa......
  • 在线JS代码混淆加密工具真的能实现JS代码加密吗?
    很多时候我们网站的JS代码都有被拷贝的风险,于是JS代码混淆加密这种能避免大部分复制的方法便出现了,可以对自己的JS加密,加密后达到安全的作用,不用担心自己辛辛苦苦写的JS给别人抄袭了。然而一段JS代码要是自己去编辑加密的话就有点费时费力了,目前加密工具也非常多,在线JS代码混淆......
  • vue项目报错:Node.js v18.16.1 error Command failed with exit code 1.
    原因:把node升级到了最新的长期支持版18.16.1,结果运行vue项目启动失败,报错如下:试了各种办法都解决不了,后面只能把node降级到16.20.1运行项目又可以启动了......
  • python解析json数据
    python解析json数据demodata={"name":"John","age":30,"hobbies":["reading","running","swimming"],"scores":[85,90,95]}forkey,valueindata.items()......
  • NestJs NestFactory.create()方法的可选的配置对象
    NestJs是一个用于构建高效、可扩展和可维护的Nodejs应用程序的框架。NestFactory是nestjs框架中的一个重要类,第一个参数接受一个根模块作为参数,第二个参数是一个可选的配置对象,用于配置应用程序实例的行为和属性。这个配置对象可以包含如下属性:logger:指定自定义的日志记录器,用于......
  • 重写JSON.stringify与JSON.parse使其支持解析function类型
    constJSONStringify=(option)=>{returnJSON.stringify(option,(key,val)=>{//处理函数丢失问题if(typeofval==='function'){return`${val}`;}//处理undefined丢失问......