一个简易的SubScribe类

这篇具有很好参考价值的文章主要介绍了一个简易的SubScribe类。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

SubScribe即发布订阅模式,在工作中有着广泛的应用,比如跨组件通信,微前端系统中跨子应用通信等等。

以下是一个简易的实现:

  • 订阅
  • 初始化时可限制类型
  • 发布

限制类型是为了让订阅者和发布者知道预制了哪些类型,避免使用了一些对方不知道的类型。

type Subscriber<T> = (param?: T) => void

export default class SubScribe<P> {
  // 订阅数据仓库
  public subscribers: Record<string, Subscriber<P>[]> = {};
  // 可允许的事件类型
  public types: undefined | string[] = undefined;

  constructor (types?: string []) {
    this.types = types;
  }

  // 订阅
  subscribe (type: string, subscriber: Subscriber<P>) {
    const _types = this.types;

    if (_types && !_types.includes(type)) {
      console.warn(`创建订阅 ${type} 失败 ,订阅类型只允许 ${_types.join(',')} 这几种...`);
      return;
    }

    if (typeof subscriber !== 'function') {
      console.warn('创建订阅失败,第二个参数必须为函数类型');
      return;
    }

    if (!this.subscribers[type]) {
      this.subscribers[type] = [];
    }

    this.subscribers[type].push(subscriber);
  }

  // 订阅一次,触发后自动取消订阅
  subscribeOnce (type: string, subscriber: Subscriber<P>) {
    if (typeof subscriber !== 'function') {
      console.warn('创建订阅失败,第二个参数必须为函数类型');
      return;
    }

    const wrap = (param?: P) => {
      subscriber(param);
      this.unSubscribe(type, wrap);
    };

    this.subscribe(type, wrap);
  }

  // 取消订阅
  unSubscribe (type: string, subscriber: Subscriber<P>) {
    if (this.subscribers[type]) {
      this.subscribers[type] = this.subscribers[type].filter(f => f !== subscriber);
    }
  }

  // 发布事件,触发订阅函数执行
  publish (type: string, param?: P) {
    const _types = this.types;

    if (_types && !_types.includes(type)) {
      console.warn(`发布 ${type} 失败,发布类型只允许 ${_types.join(',')} 这几种...`);
      return;
    }

    if (this.subscribers[type]) {
      this.subscribers[type].forEach(f => {
        f(param);
      });
    }
  }
}

以下是一个使用案例

初始化并导出一个发布订阅实例(如果是微前端系统,则将该实例传给各个子应用),然后可以通过该实例进行跨对象的通信。文章来源地址https://www.toymoban.com/news/detail-746535.html

// 初始化
export const masterSubscribe = new SubScribe(['MICRO_CHILD_ROUTE_MOUNTED', 'MICRO_ACTION']);

// 订阅
masterSubscribe &&
  masterSubscribe.subscribe('MICRO_ACTION', (params) => {
   // 执行一些动作
  });

// 发布
masterSubscribe.publish('MICRO_ACTION', {
  //...params
});

到了这里,关于一个简易的SubScribe类的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 观察者模式和发布订阅模式

    观察者模式与发布订阅模式的区别: 1、观察者模式中只有观察者和被观察者,发布订阅模式中有发布者、订阅者、调度中心 2、观察者模式是被观察者发生变化时自己通知观察者,发布订阅模式是通过调度中心来进行分布订阅操作 vue2中响应式数据就是由Object.defineProperty()和

    2024年02月13日
    浏览(55)
  • js设计模式——发布订阅模式

    一、概述 发布订阅模式是一种常用的设计模式,它定义了一种一对多的关系,让多个订阅者对象同时监听某一个主题对象,当主题对象发生变化时,它会通知所有订阅者对象,使它们能够自动更新 。 二、优缺点 1. 优点: 实现了发布者和订阅者之间的解耦,提高了代码的可

    2024年02月06日
    浏览(46)
  • js设计模式:发布订阅模式

    也称之为消息队列模式,或者pubsub模式 发布者发布消息(也可以理解为调用某函数),订阅者会收到消息,并且发布者可以将一些参数传递给订阅者。 是一种常用的参数传递方法,经典的pubsub.js,vue2中的$bus等都是用的这种模式。

    2024年02月19日
    浏览(56)
  • 行为型:发布订阅模式

      发布订阅模式是基于一个事件(主题)通道,希望接收通知的对象 Subscriber (订阅者) 通过自定义事件订阅主题,被激活事件的对象 Publisher (发布者) 通过发布主题事件的方式通知订阅者 Subscriber (订阅者) 对象。   简单说就是 发布者与订阅者通过事件来通信 ,

    2023年04月11日
    浏览(41)
  • Kafka消费者订阅指定主题(subscribe)或分区(assign)详解

    在连接Kafka服务器消费数据前,需要创建Kafka消费者进行拉取数据,需要配置相应的参数,比如设置消费者所属的消费者组名称、连接的broker服务器地址、序列号和反序列化的方式等配置。 更多消费者配置可参考官网: https://kafka.apache.org/documentation/#consumerconfigs 订阅主题(s

    2023年04月24日
    浏览(46)
  • 观察者模式, 发布-订阅模式, 监听器模式

    观察者模式是一种 行为型 设计模式, 定义对象间的一种 一对多 的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新 角色模型和结构图 在观察者模式中,只有两种主体:目标对象 ( Object ) 和 观察者 ( Observer )。宗门任务大殿就是目标对象

    2024年02月22日
    浏览(47)
  • 观察者模式和发布订阅模式的区别

    从下图中可以看出, 观察者模式中观察者和目标直接进行交互,而发布订阅模式中统一由调度中心进行处理,订阅者和发布者互不干扰 。这样一方面实现了 解耦 ,还有就是可以实现更细粒度的一些控制。比如发布者发布了很多消息,但是不想所有的订阅者都接收到,就可以

    2024年02月22日
    浏览(57)
  • 设计模式之观察者(发布订阅)模式

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同事监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己 观察者模式主要解决的问题: 当一个对象状态发生改变后给其他的对象通知 观察者的优点: 观察者和

    2024年02月07日
    浏览(52)
  • Spring 中的发布-订阅模式

    现在市面上流行的很多消息中间件就是采用的该种模式,这种模式 在实际业务中 将 事件发布者(Publisher) 与 事件订阅者 (Subscriber)通过额外的事件通道(Event Channel)来解耦,其基本原理与先前提到的观察者模式有些许类似,但发布订阅模式额外存在了 Event Channel 的概念,

    2024年04月22日
    浏览(42)
  • 微信小程序 -订阅发布模式

    图形展示: 代码展示: 1. 安装模块 pubsub-js 2. 导入模块(在需要订阅发布的 js 页面内进行导入) 注:在微信小程序中无法直接npm 下载 导入 的(安装一个就需要构建一次) 解决: 菜单栏 -- 工具 --  构建 npm   点击即可(会出现新的目录) 详情页: 1. 绑定两个事件,用于

    2024年02月04日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包