首页 > web前端 > js教程 > 正文

javascript_如何实现发布订阅模式

狼影
发布: 2025-12-02 19:40:34
原创
384人浏览过
发布订阅模式通过事件中心解耦发送者与接收者,核心为on、emit、off方法,实现事件的订阅、发布与取消,适用于组件通信、状态管理等场景。

javascript_如何实现发布订阅模式

发布订阅模式是一种经典的设计模式,适用于解耦事件的发送者和接收者。在 JavaScript 中实现发布订阅模式,核心是创建一个事件中心,允许对象订阅特定事件,并在事件被触发时通知所有订阅者。

定义事件中心

事件中心是发布订阅模式的核心,它负责管理事件的注册、触发和移除。你可以通过一个简单的对象来实现:

on(event, callback):订阅事件,将回调函数添加到对应事件的队列中。
emit(event, data):发布事件,执行该事件下所有订阅的回调函数,并传入数据。
off(event, callback):取消订阅,从事件队列中移除指定的回调函数。

示例代码:

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

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

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

  off(event, callback) {
    if (this.events[event]) {
      this.events[event] = this.events[event].filter(cb => cb !== callback);
    }
  }
}
登录后复制

使用示例

创建一个事件中心实例,然后让不同部分订阅和发布消息:

立即学习Java免费学习笔记(深入)”;

青泥AI
青泥AI

青泥学术AI写作辅助平台

青泥AI 302
查看详情 青泥AI
const eventBus = new EventEmitter();

// 订阅事件
eventBus.on('userLogin', user => {
  console.log('欢迎 ' + user.name);
});

eventBus.on('userLogin', user => {
  console.log('更新用户状态:' + user.status);
});

// 发布事件
eventBus.emit('userLogin', { name: 'Alice', status: 'online' });
登录后复制

输出结果:

欢迎 Alice
更新用户状态:online
登录后复制

支持取消订阅

为了避免内存泄漏或重复执行,可以移除不再需要的订阅:

function welcome(user) {
  console.log('欢迎 ' + user.name);
}

eventBus.on('userLogin', welcome);

// 取消订阅
eventBus.off('userLogin', welcome);
登录后复制

这样,welcome 函数不会再被调用。

实际应用场景

组件通信:在前端框架中,父子组件或兄弟组件可通过事件中心通信。
状态管理:全局状态变化时通知多个视图更新。
异步任务协调:某个异步操作完成后通知多个监听者。

基本上就这些。发布订阅模式在 JavaScript 中实现简单,却非常实用。只要掌握 on、emit、off 三个方法的逻辑,就能灵活运用在各种场景中。不复杂但容易忽略细节,比如重复订阅或忘记解绑。

以上就是javascript_如何实现发布订阅模式的详细内容,更多请关注php中文网其它相关文章!

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号