首页 > 编程语言 >前端如何使用Javascript实现一个简单的发布订阅模式

前端如何使用Javascript实现一个简单的发布订阅模式

时间:2024-04-19 13:00:28浏览次数:29  
标签:订阅 前端 Javascript EventEmitter eventName callback 事件 events

在前端开发中,我们经常需要处理事件的订阅与发布,以实现组件之间的解耦和通信。本文将介绍如何使用 JavaScript 实现一个简单的发布订阅模式,通过分步写代码的方式,带领读者一步步完成实现过程。

步骤一:定义 EventEmitter 类

首先,我们需要定义一个名为 EventEmitter 的类,作为发布订阅模式的核心组件。初始化一个空对象 events,用于存储不同事件及其对应的回调函数。

class EventEmitter {
  constructor () {
       this.events = {};
   }
}

其次,我们需要定义三个主要方法:onemitoff,分别用于订阅事件、发布事件和取消订阅事件。

1.订阅事件(on 方法):

on(eventName, callback) {
  // 订阅事件
  this.events[eventName] = this.events[eventName] || [];
  this.events[eventName].push(callback);
}

    on 方法接受两个参数:eventName 表示事件名称,callback 表示事件发生时要执行的回调函数。该方法将事件名称作为键,回调函数作为值存储在 events 对象            中。如果已经有同名事件存在,则将回调函数添加到已有事件的回调函数数组中;如果不存在,则创建一个新的事件数组并添加。

2.发布事件(emit 方法)

emit(eventName, ...args) {
  // 发布事件
  if (this.events[eventName]) {
    this.events[eventName].forEach(callback => {
      callback.apply(null, args);
    });
  }
}

emit 方法接受至少一个参数 eventName,表示要发布的事件名称,可以额外传入任意数量的参数作为事件回调函数的参数。该方法首先检查是否存在指定名称的事件,如果存在,则依次调用该事件的所有回调函数,并传入额外参数;如果不存在,则不执行任何操作。

3.取消订阅事件(off 方法):

off(eventName, callback) {
  // 取消订阅事件
  if (this.events[eventName]) {
    this.events[eventName] = this.events[eventName].filter(cb => cb !== callback);
  }
}

off 方法用于取消对指定事件的订阅。它接受两个参数:eventName 表示要取消订阅的事件名称,callback 表示要取消订阅的回调函数。该方法首先检查指定名称的事件是否存在,如果存在,则将传入的回调函数从事件的回调函数数组中移除,实现取消订阅的效果。

这样,我们就完成了 EventEmitter 类的定义,具备了基本的订阅、发布和取消订阅事件的功能。下面可以用一个demo验证一下

// 创建 EventEmitter 实例
const eventEmitter = new EventEmitter();

// 订阅事件
eventEmitter.on('message', message => {
  console.log('Received message:', message);
});

// 发布事件
eventEmitter.emit('message', 'Hello, World!');

// 取消订阅事件
eventEmitter.off('message');

通过以上步骤,我们成功地实现了一个简单的发布订阅模式。通过 EventEmitter 类,我们可以方便地进行事件的订阅和发布,实现组件之间的解耦和通信。这种模式在前端开发中有着广泛的应用,可以帮助我们更好地组织和管理代码。

标签:订阅,前端,Javascript,EventEmitter,eventName,callback,事件,events
From: https://www.cnblogs.com/july-Vivian/p/18145644

相关文章

  • JavaScript本地存储的方式有哪些
    Web存储技术1.localStorage特点:长期存储,除非手动删除否则会一直保存在浏览器中,清除缓存或卸载浏览器后消失。存储语法:window.localStorage.setItem(名字,值)获取语法:window.localStorage.getItem(名字)删除语法:window.localStorage.removeItem(名字)作用:删除localStorage......
  • 今天依然是写前端的一天--前端页面的搭建
    <!--Login.vue--><scriptsetup>import{User,Lock}from'@element-plus/icons-vue'import{ref}from'vue'//控制注册与登录表单的显示,默认显示注册constisRegister=ref(false)//定义数据模型constregisterData=ref({username:'&#......
  • Spring 中的发布-订阅模式
    发布订阅模式是怎样的?现在市面上流行的很多消息中间件就是采用的该种模式,这种模式在实际业务中将事件发布者(Publisher)与事件订阅者(Subscriber)通过额外的事件通道(EventChannel)来解耦,其基本原理与先前提到的观察者模式有些许类似,但发布订阅模式额外存在了EventChannel的......
  • JavaScripts浮点数计算问题
    JS数学运算精度问题最近项目上JS做加减乘除这类的运算出现了精度不匹配的问题:例如:0.1+0.2->0.300000000000000040.3-0.2->0.099999999999999980.3*2->0.60.3*0.20.060.3/3->0.09999999999999999Mathjs这个JS库可以解决这类问题:官网链接以下是详细的步骤:终端执......
  • Web前端基础
    HTML&CSS基础HTML:结构(页面元素和内容)css:表现(网页元素的外观和位置等页面样式)行为:JavaScript:行为(网页模型定义与页面交互)排版标签排版标签标题标签:h系列标签重要程度依次递减特点:独占一行、h1-h6文字逐渐减小段落标签:p特点:段落之间存在间隙、独占一行文本格式化标签场景......
  • 前端【小程序】10-小程序基础篇【事件对象】
    事件处理事件对象前面已经介绍过小程序事件监听的语法:bind:事件类型=事件回调,但是小程序的事件回调不支持传参数,因此要将模板中的数据传递到事件回调中就必须要通过事件对象来实现。小程序事件回调函数的第1个参数即为事件对象,事件对象中包括了一些有用的信息:index.......
  • 如何在HTML中使用JavaScript:从基础到高级的全面指南!
    JavaScript是一种轻量级的编程语言,通常用于网页开发,以增强用户界面的交互性和动态性。然而在HTML中,有多种方法可以嵌入和使用JavaScript代码。本文就带大家深入了解如何在HTML中使用JavaScript。一、使用script标签要在HTML中使用JavaScript,我们需要使用<script>标签。这个标......
  • 前端面试题解析与总结
    在2024年的前端行业,面试是进入理想公司的一道门槛。不同公司的面试流程和考察点各有不同,下面将结合三家知名公司的面试题目进行分析和总结,为广大前端开发者提供一份参考指南。一、某对外电商一面:笔试题:弹窗组件防抖截流代码实现关系型数组转换成树形结构对象数组全排列......
  • jeecg-boot前端v-has权限控制
    v-has是一个很方便的前端权限控制标签,目前只支持一个授权标识,如果需要两个或以上的权限与或运算就不支持了。解决:修改路径下src/utils/hasPermission.js中的 filterGlobalPermission方法原代码 修改后 代码:letvalue=binding.value//目前只支持全与、全或......
  • 前端【小程序】04-小程序基础篇【分包加载】
    一、分包加载官方文档:https://developers.weixin.qq.com/miniprogram/dev/framework/subpackages.html​分包加载是优化小程序加载速度的一种手段。1.1为什么?​微信平台对小程序单个包的代码体积限制为2M,超过2M的情况下可以采用分包来解决即使小程序代码体积没......