自定义事件总线

简介: JS查漏补缺系列是我在学习JS高级语法时做的笔记,通过实践费曼学习法进一步加深自己对其的理解,也希望别人能通过我的笔记能学习到相关的知识点。这一次我们来试着自定义事件总线

知识回顾

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

  • 发布者(Publisher):发出事件(Event);
  • 订阅者(Subscriber):订阅事件(Event),并且会进行响应(Handler);
  • 事件总线(EventBus):无论是发布者还是订阅者都是通过事件总线作为中台的;

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

  • Vue2默认是带有事件总线的功能;
  • Vue3中推荐一些第三方库,比如mitt;

自定义事件总线

:::info
实现功能:事件的监听方法on; 事件的发射方法emit; 事件的取消监听off;
:::
大体框架

class HYEventBus {
  constructor() {
    this.eventBus = {}
  }

  // 监听
  on() {
    
  }

  // 取消
  off() {
   
  }

  // 发送
  emit() {
  
  }
}

事件的监听方法on

 on(eventName, eventCallback, thisArg) {
    let handlers = this.eventBus[eventName]
    if (!handlers) {
      handlers = []
      this.eventBus[eventName] = handlers
    }
    handlers.push({
      eventCallback,
      thisArg
    })
  }

事件的取消监听off

 off(eventName, eventCallback) {
    const handlers = this.eventBus[eventName]
    if (!handlers) return
    const newHandlers = [...handlers]
    for (let i = 0; i < newHandlers.length; i++) {
      const handler = newHandlers[i]
      if (handler.eventCallback === eventCallback) {
        const index = handlers.indexOf(handler)
        handlers.splice(index, 1)
      }
    }
  }

事件的发射方法emit

emit(eventName, ...payload) {
    const handlers = this.eventBus[eventName]
    if (!handlers) return
    handlers.forEach(handler => {
      handler.eventCallback.apply(handler.thisArg, payload)
    })
  }

使用

const eventBus = new HYEventBus()

// main.js
eventBus.on("abc", function() {
  console.log("监听abc1", this)
}, {name: "玛卡巴卡"})

const handleCallback = function() {
  console.log("监听abc2", this)
}
eventBus.on("abc", handleCallback, {name: "玛卡巴卡"})

// utils.js
eventBus.emit("abc", 123)

// 移除监听
eventBus.off("abc", handleCallback)
eventBus.emit("abc", 123)
目录
相关文章
|
7月前
|
消息中间件 JavaScript 中间件
中间件事件总线事件定义
【6月更文挑战第20天】
73 2
中间件事件总线事件定义
|
7月前
|
消息中间件 中间件 Kafka
中间件事件总线路由与分发
【6月更文挑战第20天】
45 1
中间件事件总线路由与分发
|
7月前
|
消息中间件 设计模式 中间件
中间件事件总线发布与订阅
【6月更文挑战第20天】
72 4
|
7月前
|
消息中间件 监控 中间件
中间件事件总线实现机制
【6月更文挑战第21天】
57 1
|
8月前
|
Linux
统一事件源
统一事件源
87 0
|
JSON 数据格式
EventBridge事件领域
EventBridge事件领域
71 0
|
消息中间件 机器人 Serverless
|
消息中间件 机器学习/深度学习 Kubernetes
EventBridge 事件总线及 EDA 架构解析
EventBridge 是事件驱动的具体落地产品,也是 EDA 的最佳实践方式。
457 0
|
API 调度
阿里云事件总线 EventBridge 最佳实践
本文介绍如何把阿里云事件总线 EventBridge 的内容接入观测云平台,通过观测云强大的统一汇聚能力轻松获取阿里云事件,实时追踪最新的数据信息。
257 0

热门文章

最新文章