js简单粗暴的发布订阅示例代码


Posted in Javascript onJanuary 23, 2021

什么是发布/订阅?

我打个比方,你去某个门店买衣服,你和门店店长相互并不认识,门店店长只管卖他的衣服,并不关心是谁来买,而你也只管买你想要的衣服,并不关心是哪个门店在卖,这时,门店和你就组成了一个发布/订阅的关系。

当门店挂出衣服款式,你去找你想要的衣服,如果找到了,那就买下来,如果没找到,那就离开这家店。整个过程就是这么简单。

使用场景

异步通信、多页面间相互通信,pageA 的方法想在 pageB的方法调用的某个时机触发

直接上代码

class Publish {
 constructor() {
  this.listMap = {};
 }
	// 订阅
 on(key, fn) {
  this.listMap[key]
   ? this.listMap[key].push(fn)
   : this.listMap[key] = [fn];
   
		// 存储订阅fn的下标
  const index = this.listMap[key].length - 1;
  
		// 返回取消订阅的function
  return () => this.clear(key, index);
 }
 
	// 取消所有该key订阅
 off(key) {
  delete this.listMap[key];
 }
 
	// 取消key的指定的某个订阅
 clear(key, index) {
  index === this.listMap[key].length - 1
   ? this.listMap[key].pop()
   : this.listMap[key][index] = null;
 }
 
	//订阅一次触发后自动取消订阅
 once(key, fn) {
  this.on(key, (...rest) => {
   fn(...rest);
   this.off(key);
  });
 }

	// 发布key
 trigger(key, ...rest) {
 	if(key in this.listMap) {
	 	this.listMap[key].forEach(fn => {
	   fn(...rest);
	  });
 	}
 }
}

使用方法

const ob = new Publish();

// 订阅 sub1
const sub1 = ob.on('sub1', (a, b) => {
 console.log('sub1', a, b);
});

// 订阅 sub1
const sub11 = ob.on('sub1', (a, b) => {
 console.log('sub11', a, b);
});

ob.trigger('sub1', 2, 3);

// 取消订阅sub1
sub1();

// 取消订阅sub11
sub11();

// 订阅 sub3
ob.on('sub3', (a, b) => {
 console.log('sub3', a, b);
});

// 订阅 sub3
ob.on('sub3', (a, b) => {
 console.log('sub33', a, b);
});

ob.trigger('sub3', 6, 7);

// 取消订阅所有的sub3
ob.off('sub3');

// 订阅一次就自行取消订阅
ob.once('sub4', (a, b) => {
 console.log('sub4', a, b);
});

ob.trigger('sub4', 8, 9);

总结

到此这篇关于js简单粗暴的发布订阅的文章就介绍到这了,更多相关js简单发布订阅内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript操作referer详细解析
Mar 10 Javascript
js获取指定日期周数以及星期几的小例子
Jun 27 Javascript
微信小程序 支付功能(前端)的实现
May 24 Javascript
详解react使用react-bootstrap当轮子造车
Aug 15 Javascript
JavaScript文件的同步和异步加载的实现代码
Aug 19 Javascript
简单谈谈vue的过渡动画(推荐)
Oct 11 Javascript
Vue SSR 组件加载问题
May 02 Javascript
jQuery插件实现的日历功能示例【附源码下载】
Sep 07 jQuery
vue2过滤器模糊查询方法
Sep 16 Javascript
node实现分片下载的示例代码
Oct 17 Javascript
JS 逻辑判断不要只知道用 if-else 和 switch条件判断(小技巧)
May 27 Javascript
解决vue中el-tab-pane切换的问题
Jul 19 Javascript
JS中循环遍历数组的四种方式总结
Jan 23 #Javascript
vue form表单post请求结合Servlet实现文件上传功能
Jan 22 #Vue.js
原生js实现自定义难度的扫雷游戏
Jan 22 #Javascript
Element-ui upload上传文件限制的解决方法
Jan 22 #Javascript
js canvas实现五子棋小游戏
Jan 22 #Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
Jan 22 #Vue.js
element-ui 弹窗组件封装的步骤
Jan 22 #Javascript
You might like
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
php支持中文字符串分割的函数
2015/05/28 PHP
PHP中call_user_func_array回调函数的用法示例
2016/11/26 PHP
Yii2框架类自动加载机制实例分析
2018/05/02 PHP
jquery 必填项判断表单是否为空的方法
2008/09/14 Javascript
Javascript 调试利器 Firebug使用详解六
2009/07/05 Javascript
JS在IE和FireFox之间常用函数的区别小结
2010/03/12 Javascript
js 控制图片大小核心讲解
2013/10/09 Javascript
防止jQuery ajax Load使用缓存的方法小结
2014/02/22 Javascript
node.js开发中使用Node Supervisor实现监测文件修改并自动重启应用
2014/11/04 Javascript
jquery密码强度校验
2015/12/02 Javascript
解析预加载显示图片艺术
2016/12/05 Javascript
ES6(ECMAScript 6)新特性之模板字符串用法分析
2017/04/01 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
Vue项目webpack打包部署到Tomcat刷新报404错误问题的解决方案
2018/05/15 Javascript
webpack4之如何编写loader的方法步骤
2019/06/06 Javascript
Vue+Java 通过websocket实现服务器与客户端双向通信操作
2020/09/22 Javascript
[01:11:32]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
Python中使用第三方库xlrd来写入Excel文件示例
2015/04/05 Python
Python实现识别手写数字 Python图片读入与处理
2020/03/23 Python
在Python dataframe中出生日期转化为年龄的实现方法
2018/10/20 Python
Pandas之Fillna填充缺失数据的方法
2019/06/25 Python
Pycharm制作搞怪弹窗的实现代码
2021/02/19 Python
AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码
2020/08/19 HTML / CSS
美国皮靴公司自1863年:The Frye Company
2016/11/30 全球购物
欧舒丹比利时官网:L’OCCITANE比利时
2017/04/25 全球购物
乐高官方旗舰店:LEGO积木玩具
2019/04/06 全球购物
西班牙鞋子和箱包在线销售网站:zapatos.es
2020/02/17 全球购物
如何反序的迭代一个序列?how do I iterate over a sequence in reverse order
2012/02/04 面试题
任课老师推荐信范文
2013/11/24 职场文书
逃课打麻将检讨书
2014/10/05 职场文书
2014年军人思想汇报范文
2014/10/12 职场文书
介绍信样本
2015/01/31 职场文书
雷锋的观后感
2015/06/10 职场文书
教师远程研修感悟
2015/11/18 职场文书
spring cloud 配置中心客户端启动遇到的问题
2021/09/25 Java/Android