JS中发布/订阅模式的简单应用

简介: JS中发布/订阅模式的简单应用

深入理解JavaScript中的发布/订阅模式

在现代的前端开发中,我们经常会遇到需要多个组件或模块间进行通信的情况。为了解耦这些组件,使它们之间的依赖关系降到最低,并实现更加灵活和可维护的代码,我们经常会使用一些设计模式。其中,发布/订阅模式(也被称为观察者模式)是一种非常常见且有用的模式。

什么是发布/订阅模式?

发布/订阅模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,它的所有依赖者(订阅者)都会自动收到通知并更新。

在个模式的好处自安于能够对代码进行解耦,实现了“高内聚,低耦合”的理念。

1.建立一个事件总线。

2.发布事件。

3.订阅事件。

//事件总线,管理事件
class Notcice {
    #arr = new Map()
    constructor() {

    }
    add(str, fn) {
        if (this.#arr.has(str)) {
            this.#arr.set(str, fn)
        } else {
            throw new Error("这个事件已经被注册了")
        }

    }
    emit(str, params) {
        if (this.#arr.has(str)) {
            this.#arr.get(str)(params);
        } else {
            throw new Error("别TM瞎掉")
        }
    }
}
//new 一个实例,并且一直用这个实例,保证我们的只有一个总线
let myNotice = new Notcice()
//发布一个eat事件
myNotice.add("eat", (params) => {
    console.log(`吃${params}`);
})
//订阅
myNotice.emit("eat", "苹果")

发布者(Publisher)

发布者是可以发送消息的对象,它们维护了一个或多个订阅者的列表,并在适当的时候通知它们。

订阅者(Subscriber)

订阅者是对特定事件感兴趣的对象,它们将自己注册到发布者上,以便在事件发生时接收通知。

事件(Event)

事件是发布者向订阅者发送的消息或通知。

JavaScript中的实现

在JavaScript中,我们可以使用原生的对象和数组来实现发布/订阅模式。下面是一个简单的例子:

class PubSub {
  constructor() {
    this.subscribers = {};
  }

  subscribe(event, callback) {
    if (!this.subscribers[event]) {
      this.subscribers[event] = [];
    }
    this.subscribers[event].push(callback);
  }

  publish(event, data) {
    if (this.subscribers[event]) {
      this.subscribers[event].forEach(callback => callback(data));
    }
  }
}

// 使用
const pubSub = new PubSub();

// 订阅者1
pubSub.subscribe('message', (data) => {
  console.log('订阅者1收到消息:', data);
});

// 订阅者2
pubSub.subscribe('message', (data) => {
  console.log('订阅者2收到消息:', data);
});

// 发布者发布消息
pubSub.publish('message', 'Hello, World!');

在这个例子中,我们创建了一个PubSub类,它有两个主要的方法:subscribepublishsubscribe方法用于注册事件和对应的回调函数,而publish方法用于发布事件并传递数据给所有订阅了该事件的回调函数。

应用场景

发布/订阅模式在前端开发中有着广泛的应用,下面列举了几个常见的场景:

1. 自定义事件

在复杂的单页应用(SPA)中,组件之间的通信经常需要跨越多个层级。使用发布/订阅模式,我们可以创建自定义事件,让组件在需要的时候触发这些事件,而其他组件可以订阅这些事件并在事件发生时执行相应的逻辑。

2. 状态管理

在前端状态管理库(如Redux、Vuex)中,发布/订阅模式是实现状态更新的核心机制。当状态发生变化时,所有订阅了该状态的组件都会收到通知并重新渲染。

3. 异步编程

在异步编程中,发布/订阅模式可以帮助我们解耦异步操作和它们的回调函数。例如,我们可以使用Promise或async/await语法来订阅一个异步操作的结果,并在操作完成时执行相应的逻辑。

4. 插件系统

在插件系统中,发布/订阅模式可以让插件之间以解耦的方式进行通信。插件可以订阅系统事件,并在事件发生时执行相应的操作,从而实现插件之间的协作和扩展。

注意事项

虽然发布/订阅模式非常有用,但在使用时也需要注意一些问题:

1. 内存泄漏

如果订阅者不再需要接收某个事件的消息,但没有取消订阅,那么当该事件再次发生时,订阅者的回调函数仍然会被执行。这可能会导致内存泄漏和不必要的计算。因此,我们需要在适当的时候取消订阅。

2. 事件命名冲突

如果不同的发布者发布了同名的事件,或者订阅者订阅了多个同名的事件,那么可能会发生事件命名冲突。为了避免这种情况,我们可以使用命名空间或唯一标识符来区分不同的事件。

3. 回调函数的执行顺序

在发布事件时,订阅者的回调函数是按照它们被注册的顺序依次执行的。如果回调函数的执行顺序很重要,我们需要确保它们按照正确的顺序注册。

结论

发布/订阅模式是一种非常强大且灵活的设计模式,它可以帮助我们解耦组件、降低依赖关系,并实现更加可维护和可扩展的代码。在前端开发中,我们可以利用JavaScript的原生特性来实现这种模式,并应用于自定义事件、状态管理、异步编程和插件系统等场景。但在使用时,我们也需要注意内存泄漏、事件命名冲突和回调函数的执行顺序等问题。通过合理地运用发布/订阅模式,我们可以编写出更加优雅和高效的前端代码。


是不是很简单啊?喜欢的小伙伴留言点赞关注吧!

相关文章
|
12月前
|
JavaScript 前端开发
如何减少Node.js应用中的全局变量?
如何减少Node.js应用中的全局变量?
670 165
|
9月前
|
存储 监控 JavaScript
基于布隆过滤器的 Node.js 算法在局域网电脑桌面监控设备快速校验中的应用研究
本文探讨了布隆过滤器在局域网电脑桌面监控中的应用,分析其高效空间利用率、快速查询性能及动态扩容优势,并设计了基于MAC地址的校验模型,提供Node.js实现代码,适用于设备准入控制与重复数据过滤场景。
307 0
|
8月前
|
运维 监控 JavaScript
基于 Node.js 图结构的局域网设备拓扑分析算法在局域网内监控软件中的应用研究
本文探讨图结构在局域网监控系统中的应用,通过Node.js实现设备拓扑建模、路径分析与故障定位,提升网络可视化、可追溯性与运维效率,结合模拟实验验证其高效性与准确性。
428 3
|
前端开发 搜索推荐 JavaScript
如何通过DIY.JS快速构建出一个DIY手机壳、T恤的应用?
DIY.JS 是一款基于原生 Canvas 的业务级图形库,专注于商品定制的图形交互功能,帮助开发者轻松实现个性化设计。适用于 T 恤、手机壳等多种商品场景。它自带丰富功能,无需从零构建,快速集成到项目中。通过创建舞台、添加模型、定义 DIY 区域和添加素材四个步骤即可完成基础用法。支持在线演示体验,文档详细,易上手。
590 57
|
9月前
|
资源调度 负载均衡 JavaScript
使用PM2工具部署Vue.js应用于服务器
以上步骤完成之后,你就成功利⽤ PM⼆工具将 Vuejs 应⽰程序部署至服 务 器,并且配合反向代理实现了高效稳定访问及负载均衡功能。
407 0
|
12月前
|
监控 算法 JavaScript
公司局域网管理视域下 Node.js 图算法的深度应用研究:拓扑结构建模与流量优化策略探析
本文探讨了图论算法在公司局域网管理中的应用,针对设备互联复杂、流量调度低效及安全监控困难等问题,提出基于图论的解决方案。通过节点与边建模局域网拓扑结构,利用DFS/BFS实现设备快速发现,Dijkstra算法优化流量路径,社区检测算法识别安全风险。结合WorkWin软件实例,展示了算法在设备管理、流量调度与安全监控中的价值,为智能化局域网管理提供了理论与实践指导。
301 3
|
存储 JavaScript 前端开发
|
JavaScript 前端开发 Docker
如何通过pm2以cluster模式多进程部署next.js(包括docker下的部署)
通过这些步骤,可以确保您的Next.js应用在多核服务器上高效运行,并且在Docker环境中实现高效的容器化管理。
1474 44
|
JavaScript 前端开发 算法
JavaScript 中通过Array.sort() 实现多字段排序、排序稳定性、随机排序洗牌算法、优化排序性能,JS中排序算法的使用详解(附实际应用代码)
Array.sort() 是一个功能强大的方法,通过自定义的比较函数,可以处理各种复杂的排序逻辑。无论是简单的数字排序,还是多字段、嵌套对象、分组排序等高级应用,Array.sort() 都能胜任。同时,通过性能优化技巧(如映射排序)和结合其他数组方法(如 reduce),Array.sort() 可以用来实现高效的数据处理逻辑。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

热门文章

最新文章