翼度科技»论坛 编程开发 JavaScript 查看内容

一个简易的SubScribe类

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
SubScribe即发布订阅模式,在工作中有着广泛的应用,比如跨组件通信,微前端系统中跨子应用通信等等。
以下是一个简易的实现:

  • 订阅
  • 初始化时可限制类型
  • 发布
限制类型是为了让订阅者和发布者知道预制了哪些类型,避免使用了一些对方不知道的类型。
  1. type Subscriber<T> = (param?: T) => void
  2. export default class SubScribe<P> {
  3.   // 订阅数据仓库
  4.   public subscribers: Record<string, Subscriber<P>[]> = {};
  5.   // 可允许的事件类型
  6.   public types: undefined | string[] = undefined;
  7.   constructor (types?: string []) {
  8.     this.types = types;
  9.   }
  10.   // 订阅
  11.   subscribe (type: string, subscriber: Subscriber<P>) {
  12.     const _types = this.types;
  13.     if (_types && !_types.includes(type)) {
  14.       console.warn(`创建订阅 ${type} 失败 ,订阅类型只允许 ${_types.join(',')} 这几种...`);
  15.       return;
  16.     }
  17.     if (typeof subscriber !== 'function') {
  18.       console.warn('创建订阅失败,第二个参数必须为函数类型');
  19.       return;
  20.     }
  21.     if (!this.subscribers[type]) {
  22.       this.subscribers[type] = [];
  23.     }
  24.     this.subscribers[type].push(subscriber);
  25.   }
  26.   // 订阅一次,触发后自动取消订阅
  27.   subscribeOnce (type: string, subscriber: Subscriber<P>) {
  28.     if (typeof subscriber !== 'function') {
  29.       console.warn('创建订阅失败,第二个参数必须为函数类型');
  30.       return;
  31.     }
  32.     const wrap = (param?: P) => {
  33.       subscriber(param);
  34.       this.unSubscribe(type, wrap);
  35.     };
  36.     this.subscribe(type, wrap);
  37.   }
  38.   // 取消订阅
  39.   unSubscribe (type: string, subscriber: Subscriber<P>) {
  40.     if (this.subscribers[type]) {
  41.       this.subscribers[type] = this.subscribers[type].filter(f => f !== subscriber);
  42.     }
  43.   }
  44.   // 发布事件,触发订阅函数执行
  45.   publish (type: string, param?: P) {
  46.     const _types = this.types;
  47.     if (_types && !_types.includes(type)) {
  48.       console.warn(`发布 ${type} 失败,发布类型只允许 ${_types.join(',')} 这几种...`);
  49.       return;
  50.     }
  51.     if (this.subscribers[type]) {
  52.       this.subscribers[type].forEach(f => {
  53.         f(param);
  54.       });
  55.     }
  56.   }
  57. }
复制代码
以下是一个使用案例
初始化并导出一个发布订阅实例(如果是微前端系统,则将该实例传给各个子应用),然后可以通过该实例进行跨对象的通信。
  1. // 初始化
  2. export const masterSubscribe = new SubScribe(['MICRO_CHILD_ROUTE_MOUNTED', 'MICRO_ACTION']);
  3. // 订阅
  4. masterSubscribe &&
  5.   masterSubscribe.subscribe('MICRO_ACTION', (params) => {
  6.    // 执行一些动作
  7.   });
  8. // 发布
  9. masterSubscribe.publish('MICRO_ACTION', {
  10.   //...params
  11. });
复制代码
来源:https://www.cnblogs.com/shapeY/p/17843505.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具