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实现的网页局布刷新效果
Dec 01 Javascript
详解webpack 多入口配置
Jun 16 Javascript
React学习之事件绑定的几种方法对比
Sep 24 Javascript
Angularjs 手写日历的实现代码(不用插件)
Oct 18 Javascript
JavaScript实现微信号随机切换代码
Mar 09 Javascript
swiper在angularjs中使用循环轮播失效的解决方法
Sep 27 Javascript
layui 动态设置checbox 选中状态的例子
Sep 02 Javascript
微信小程序3D轮播实现代码
Sep 19 Javascript
js原生map实现的方法总结
Jan 19 Javascript
简单了解JS打开url的方法
Feb 21 Javascript
小程序实现点击tab切换左右滑动
Nov 16 Javascript
JavaScript事件概念详解(区分静态注册和动态注册)
Feb 05 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微信公众号开发(4)php实现自定义关键字回复
2016/12/15 PHP
thinkphp5实现无限级分类
2019/02/18 PHP
符合标准的js表单提交的代码
2007/09/13 Javascript
理解 JavaScript 预解析
2009/10/25 Javascript
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
JavaScript加强之自定义event事件
2013/09/21 Javascript
js实现Select下拉框具有输入功能的方法
2015/02/06 Javascript
通过伪协议解决父页面与iframe页面通信的问题
2015/04/05 Javascript
jQuery实现文本框输入同步的方法
2015/06/20 Javascript
JavaScript去除数组里重复值的方法
2015/07/13 Javascript
JavaScript中的return语句简单介绍
2015/12/07 Javascript
关于在Servelet中如何获取当前时间的操作方法
2016/06/28 Javascript
浅谈jquery选择器 :first与:first-child的区别
2016/11/20 Javascript
微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
2016/12/02 Javascript
angularjs ocLazyLoad分步加载js文件实例
2017/01/17 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
jQuery中的on与bind绑定事件区别实例详解
2017/02/28 Javascript
详解如何在Vue2中实现组件props双向绑定
2017/03/29 Javascript
zTree树形插件异步加载方法详解
2017/06/14 Javascript
Javascript实现找不同色块的游戏
2017/07/17 Javascript
使用vue-router设置每个页面的title方法
2018/02/11 Javascript
vue-cli 3.x配置跨域代理的实现方法
2019/04/12 Javascript
Vue是怎么渲染template内的标签内容的
2020/06/05 Javascript
[53:44]DOTA2-DPC中国联赛 正赛 PSG.LGD vs Magma BO3 第一场 1月31日
2021/03/11 DOTA
深入浅析Python字符编码
2015/11/12 Python
Python针对给定列表中元素进行翻转操作的方法分析
2018/04/27 Python
python实现旋转和水平翻转的方法
2018/10/25 Python
实例讲解Python中整数的最大值输出
2019/03/17 Python
MNIST数据集转化为二维图片的实现示例
2020/01/10 Python
Python判断字符串是否为空和null方法实例
2020/04/26 Python
成人大专生实习期的自我评价
2013/10/02 职场文书
行政人事经理职位说明书
2014/03/05 职场文书
读书活动实施方案
2014/03/10 职场文书
工作批评与自我批评范文
2014/10/16 职场文书
六年级学生评语大全
2014/12/26 职场文书
公务员年度考核个人总结
2015/02/12 职场文书