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 相关文章推荐
js类中获取外部函数名的方法与代码
Sep 12 Javascript
js获取单选框或复选框值及操作
Dec 18 Javascript
jQuery实现的支持IE的html滑动条
Mar 16 Javascript
JavaScript中操作Mysql数据库实例
Apr 02 Javascript
jQuery实现的手机发送验证码倒计时效果代码分享
Aug 24 Javascript
第一次接触神奇的前端框架vue.js
Dec 01 Javascript
vue-dialog的弹出层组件
May 25 Javascript
vue实现未登录跳转到登录页面的方法
Jul 17 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
Sep 30 Javascript
Vue中的vue-resource示例详解
Nov 02 Javascript
利用vue-i18n实现多语言切换效果的方法
Jun 19 Javascript
Vue中keep-alive组件作用详解
Feb 04 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 反向排序和随机排序代码
2010/06/30 PHP
php eval函数用法总结
2012/10/31 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
php实现cc攻击防御和防止快速刷新页面示例
2014/02/13 PHP
laravel5.2表单验证,并显示错误信息的实例
2019/09/29 PHP
javascript jQuery插件练习
2008/12/24 Javascript
Extjs Ext.MessageBox.confirm 确认对话框详解
2010/04/02 Javascript
js 窗口抖动示例
2013/09/04 Javascript
JS实现动态给图片添加边框的方法
2015/04/01 Javascript
JavaScript编写检测用户所使用的浏览器的代码示例
2016/05/05 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
基于canvas的二维码邀请函生成插件
2017/02/14 Javascript
字太多用...代替的方法(两种)
2017/03/15 Javascript
微信小程序实战之自定义模态弹窗(8)
2017/04/18 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
详解vue静态资源打包中的坑与解决方案
2018/02/05 Javascript
nodeJs爬虫的技术点总结
2018/05/13 NodeJs
Element输入框带历史查询记录的实现示例
2019/01/15 Javascript
使用nvm和nrm优化node.js工作流的方法
2019/01/17 Javascript
浅谈layui使用模板引擎动态渲染元素要注意的问题
2019/09/14 Javascript
JavaScript制作3D旋转相册
2020/08/02 Javascript
vue实现树状表格效果
2020/12/29 Vue.js
[02:38]DOTA2超级联赛专访Loda 认为IG世界最强
2013/05/27 DOTA
python字符串连接方法分析
2016/04/12 Python
Python计算斗牛游戏概率算法实例分析
2017/09/26 Python
python如何生成各种随机分布图
2018/08/27 Python
Python3使用xlrd、xlwt处理Excel方法数据
2020/02/28 Python
python 利用openpyxl读取Excel表格中指定的行或列教程
2021/02/06 Python
英国领先的NHS批准的在线药店:Pharmacy2U
2017/01/06 全球购物
德国网上药房:Apotal
2017/04/04 全球购物
Glamest意大利:女性在线奢侈品零售店
2019/04/28 全球购物
党员剖析材料范文
2014/09/30 职场文书
网站出售协议书范文
2014/10/10 职场文书
财政局党的群众路线教育实践活动剖析材料
2014/10/13 职场文书
2016廉洁从政心得体会
2016/01/19 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书