首页 > 其他分享 >事件总线-(EventBus)

事件总线-(EventBus)

时间:2023-10-14 22:34:38浏览次数:22  
标签:abc handlers 总线 事件 EventBus eventBus

自定义事件总线

自定义事件总线属于一种观察者模式,其中包括三个角色:

口发布者(Publisher):发出事件(Event);

口订阅者(Subscriber):订阅事件(Event),并且会进行响应(Handler);

口事件总线(EventBus):无论是发布者还是订阅者都是通过事件总线作为中台的;

 

当然我们可以选择一些第三方的库:

口Vue2默认是带有事件总线的功能;

口Vue3中推荐一些第三方库,比如mitt;

 

当然我们也可以实现自己的事件总线:

口事件的监听方法on;口事件的发射方法emit;口事件的取消监听off;

 1 class EventBus{
 2     constructor(){
 3         this.eventBus={}
 4     }
 5     on(eventName,eventCallback,thisArg){
 6         let handlers=this.eventBus[eventName]
 7         if(!handlers){
 8             handlers=[]
 9             this.eventBus[eventName]=handlers
10         }
11         handlers.push({
12             eventCallback,
13             thisArg
14         })
15     }
16     off(eventName,eventCallback){
17         const handlers=this.eventBus[eventName]
18         if(!handlers)return
19         const newHandlers=[...handlers]
20         for(let i=0;i<newHandlers.length;i++){
21             const handler=newHandlers[i]
22             if(handler.eventCallback===eventCallback){
23                 const index=handlers.indexOf(handler)
24                 handlers.splice(index,1)
25             }
26         }
27     }
28     emit(eventName,...payload){
29         const handlers=this.eventBus[eventName]
30         if(!handlers)return
31         handlers.forEach(handler => {
32             handler.eventCallback.apply(handler.thisArg,payload)
33         });
34     }
35 }
36 const eventBus=new EventBus()
37 
38 //main.js
39 eventBus.on('abc',function(){
40     console.log('watch abc1',this)
41 },{name:'koo'})
42 const handleCallback=function(){
43     console.log('watch abc2',this)
44 }
45 eventBus.on('abc',handleCallback,{name:'koo'})
46 
47 //utils.js
48 eventBus.emit('abc',123)
49 
50 //移除监听
51 eventBus.off('abc',handleCallback)
52 eventBus.emit('abc',123)

 

标签:abc,handlers,总线,事件,EventBus,eventBus
From: https://www.cnblogs.com/KooTeam/p/17764867.html

相关文章

  • 事件循环
    事件循环与浏览器有关,需要先了解其进程模型。浏览器的进程模型进程程序运行需要其专属的内存空间,用于存储变量、执行函数等操作,可以将这块内存空间简单地理解为进程。每个应用至少有一个进程,进程之间相互独立,即使要通信,也需要双方同意。线程有了进程后,就可以运行程序的代码......
  • lesson13-键盘监听事件
      packagecom.zym.lesson13;importjavax.swing.*;importjava.awt.*;importjava.awt.event.KeyAdapter;importjava.awt.event.KeyEvent;publicclassTestKeyboardListener{publicstaticvoidmain(String[]args){newKeyWinFrame("lesso......
  • lesson12-窗口监听事件
      packagecom.zym.lesson12;importjavax.swing.*;importjava.awt.*;importjava.awt.event.WindowAdapter;importjava.awt.event.WindowEvent;publicclassTestWindowListener{publicstaticvoidmain(String[]args){newWinFrame("less......
  • 8088/8086微处理器与总线学习笔记总结
    目录一、微处理器与总线1.微处理器的概述1.1运算器1.2控制器1.2.1指令控制1.2.2时序控制1.2.3操作控制二、8086/8088微处理器1.8086/8088CPU的指令特点1.1指令流水线1.2内存的分段管理技术1.3支持多处理器系统2.8088/8086的外部引脚及其功能3.8086/8088的功能结构3.1内部......
  • lesson11:鼠标监听事件-绘点
      packagecom.zym.lesson11;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;importjava.util.ArrayList;importjava.util.Iterator;//测试鼠标监听事件publicclassTestMouseListener{publicstaticvoidmain(String[]args){......
  • 1553B总线测试仪
    1553B总线测试仪-天津光达航电科技有限公司在测试模拟1553B总线的标准化测试仪器,该仪器是通过简单直观的管理工具实现复杂的MIL-STD-1553的测试及模拟功能,主要包括对MIL-STD-1553B总线的在线仿真测试实时显示、数据分析、数据存盘、数据回放等功能,满足了设备检测和故障定位的需要,......
  • Vue学习笔记(十):全局事件总线
      之前博客中介绍了prop和调用事件的方式在父-子组件之间进行数据,这种方式在只有一层嵌套层时可以使用,但是路过存在多层嵌套,多层多个“兄弟”组件之间传递数据,就非常麻烦。对此,vue中提供了一种全局事件总线机制,数据传递是通过一个空的Vue实例作为中央事件总线,通过它......
  • 常见等待事件oracle
    概念描述在Oracle数据库中,等待事件是指在数据库操作过程中,进程因等待某些资源或条件而产生的等待状态。例如,当一个进程正在等待某种工作,或正在诊断和优化数据库时,就会出现等待事件。具体来说,当一个Oracle进程连接到数据库后,它将会经历一系列的等待事件,这些等待事件可以被分类为空闲......
  • JS堆、栈以及事件循环的概念
    前言其实一开始对栈、堆的概念特别模糊,只知道好像跟内存有关,又好像事件循环也沾一点边。面试薄荷的时候,面试官正好也问到了这个问题,当时只能大方的承认不会。痛定思痛,回去好好的研究一番。我们将从JS的内存机制以及事件机制和大量的(例子)来了解栈、堆究竟是个什么玩意。概念比较多......
  • 造轮子之EventBus
    前面基础管理的功能基本开发完了,接下来我们来优化一下开发功能,来添加EventBus功能。EventBus也是我们使用场景非常广的东西。这里我会实现一个本地的EventBus以及分布式的EventBus。分别使用MediatR和Cap来实现。现在简单介绍一下这两者:MediatR是一个轻量级的中介者库,用于实现应......