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 相关文章推荐
jQuery获取浏览器中的分辨率实现代码
Apr 23 Javascript
js点击选择文本的方法
Feb 09 Javascript
js实现hashtable的赋值、取值、遍历操作实例详解
Dec 25 Javascript
js, jQuery实现全选、反选功能
Mar 08 Javascript
JS中cookie的使用及缺点讲解
May 13 Javascript
ionic 自定义弹框效果
Jun 27 Javascript
详解Vue基于 Nuxt.js 实现服务端渲染(SSR)
Apr 05 Javascript
javascript和php使用ajax通信传递JSON的实例
Aug 21 Javascript
基于vue-router 多级路由redirect 重定向的问题
Sep 03 Javascript
vue父组件触发事件改变子组件的值的方法实例详解
May 07 Javascript
Vue分页器实现原理详解
Jun 28 Javascript
Antd-vue Table组件添加Click事件,实现点击某行数据教程
Nov 17 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
一个用php实现的获取URL信息的类
2007/01/02 PHP
php cookie使用方法学习笔记分享
2013/11/07 PHP
浅谈PHP SHA1withRSA加密生成签名及验签
2019/03/18 PHP
PHP isset empty函数相关面试题及解析
2020/12/11 PHP
jquery的clone方法应用于textarea和select的bug修复
2014/06/26 Javascript
javascript文本框内输入文字倒计数的方法
2015/02/24 Javascript
JQuery操作textarea,input,select,checkbox方法
2015/09/02 Javascript
jQuery的事件预绑定
2016/12/05 Javascript
深入理解js中的加载事件
2017/02/08 Javascript
浅谈$_FILES数组为空的原因
2017/02/16 Javascript
Vue框架中正确引入JS库的方法介绍
2017/07/30 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
vue2.0+SVG实现音乐播放圆形进度条组件
2019/09/21 Javascript
jQuery实现视频展示效果
2020/05/30 jQuery
使用python统计文件行数示例分享
2014/02/21 Python
Python中类的继承代码实例
2014/10/28 Python
Python中文件I/O高效操作处理的技巧分享
2017/02/04 Python
Python常见字符串操作函数小结【split()、join()、strip()】
2018/02/02 Python
利用python实现微信头像加红色数字功能
2018/03/26 Python
python实现傅里叶级数展开的实现
2018/07/21 Python
详解Python下Flask-ApScheduler快速指南
2018/11/04 Python
Python函数装饰器实现方法详解
2018/12/22 Python
python for 循环获取index索引的方法
2019/02/01 Python
python批量修改图片尺寸,并保存指定路径的实现方法
2019/07/04 Python
Python 开发工具PyCharm安装教程图文详解(新手必看)
2020/02/28 Python
浅谈Python __init__.py的作用
2020/10/28 Python
Python批量修改xml的坐标值全部转为整数的实例代码
2020/11/26 Python
Weekendesk意大利:探索多种引人入胜的周末主题
2016/10/14 全球购物
一道Delphi上机题
2012/06/04 面试题
秘书专业自荐信范文
2013/12/26 职场文书
2014年教师工作总结
2014/11/10 职场文书
社区好人好事材料
2014/12/26 职场文书
百万英镑观后感
2015/06/09 职场文书
2016年法制宣传月活动总结
2016/04/01 职场文书
关于企业的执行力标语大全
2020/01/06 职场文书
python区块链持久化和命令行接口实现简版
2022/05/25 Python