手写一个发布订阅模式(订阅 / 一次订阅 / 触发 / 关闭订阅)

本文介绍了作者自定义的JavaScript事件总线库JasonMa_PubSub,展示了如何使用on(), emit(), off()和once()方法进行事件监听、触发、取消和一次性订阅。测试中发现aa**a事件触发限制和abc事件触发频率问题。
摘要由CSDN通过智能技术生成

心血来潮,想要手写实现一个类似pubsub-js或者vue中央事件总线的发布订阅的小类库

代码如下:

新建一个文件 JasonMa_PubSub.js

const JasonMa_PubSub = {
  //存储事件及方法
  listenStore: {},
  //订阅/监听
  on: function(method, cb) {
    //如果已监听过这个方法,就push这个回调函数;如果没监听就创建键值对,值为一个数组用于存储当前回调函数
    if (this.listenStore[method]) {
      this.listenStore[method].push(cb);
    } else {
      this.listenStore[method] = [cb];
    }
  },
  //发布/触发
  emit: function(method, ...args) {
    //获取到监听方法对应的回调函数数组,逐个触发
    const fnList = this.listenStore[method];
    if (!fnList || fnList.length === 0) {
      return false;
    } else {
      fnList.forEach(cb => {
        cb.apply(this, args);
      });
    }
  },
  //关闭订阅
  off: function(method) {
    const fnList = this.listenStore[method];
    if (fnList && fnList.length !== 0) {
      delete this.listenStore[method];
    }
  },
  //只订阅一次
  once: function(method, cb) {
    let onceFn = (...args) => {
      cb.apply(this, args); //执行发布
      this.off(method); //停止订阅
    };
    this.on(method, onceFn); //注册重构后的一次监听事件
  }
};

export default JasonMa_PubSub;

 //es6引入
 import pubsub from './JasonMa_PubSub.js'

 //监听abc事件
 pubsub.on("abc", function(...args) {
  	console.log("abc触发了", args);
  });
  //监听aaaaa事件,预期仅触发一次
  pubsub.once("aaaaa", function(...args) {
    console.log("aaaaa触发了", args);
  });
  
  //每过1.5秒触发abc  aaaaa事件
  setInterval(() => {
    pubsub.emit("abc", 1, 2, 3, 4);
    pubsub.emit("aaaaa", "我是aaaaa的数据");
  }, 1500);
  
  //5秒后关闭abc事件监听
  setTimeout(() => {
    pubsub.off("abc");
  }, 5000);

结果:
aaaaa 只会触发一次
abc 只会触发3次,之后不再触发

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值