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 animate图片模向滑动示例代码
Jan 26 Javascript
JavaScript实现动态删除列表框值的方法
Aug 12 Javascript
js实现tab切换效果实例
Sep 16 Javascript
jQuery实现监控页面所有ajax请求的方法
Dec 10 Javascript
jQuery实现对无序列表的排序功能(附demo源码下载)
Jun 25 Javascript
基于JavaScript实现窗口拖动效果
Jan 18 Javascript
在vue2.0中引用element-ui组件库的方法
Jun 21 Javascript
微信小程序基于picker实现级联菜单
Feb 15 Javascript
基于mpvue的简单弹窗组件mptoast使用详解
Aug 02 Javascript
vuex actions异步修改状态的实例详解
Nov 06 Javascript
微信小程序实现上传多个文件 超过10个
Mar 30 Javascript
手写实现JS中的new
Nov 07 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 禁止页面缓存输出
2009/01/07 PHP
php URL编码解码函数代码
2009/03/10 PHP
mysql_fetch_row,mysql_fetch_array,mysql_fetch_assoc的区别
2009/04/24 PHP
微信支付PHP SDK之微信公众号支付代码详解
2015/12/09 PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
2015/12/24 PHP
Mac下php 5升级到php 7的步骤详解
2017/04/26 PHP
thinkPHP框架实现多表查询的方法
2018/06/14 PHP
javascript 隐藏/显示指定的区域附HTML元素【legend】用法
2010/03/05 Javascript
JavaScript.The.Good.Parts阅读笔记(一)假值与===运算符
2010/11/16 Javascript
用Jquery实现多级下拉框无刷新的联动
2010/12/22 Javascript
ExtJS中文乱码之GBK格式编码解决方案及代码
2013/01/20 Javascript
jQuery瀑布流插件Wookmark使用实例
2014/04/02 Javascript
jQuery的观察者模式详解
2014/12/22 Javascript
jQuery自定义添加"$"与解决"$"冲突的方法
2015/01/19 Javascript
javascript实现了照片拖拽点击置顶的照片墙代码
2015/04/03 Javascript
AngularJS 使用$sce控制代码安全检查
2016/01/05 Javascript
JavaScript判断微信浏览器实例代码
2016/06/13 Javascript
Javascript this 函数深入详解
2016/12/13 Javascript
jQuery实现select模糊查询(反射机制)
2017/01/14 Javascript
JavaScript实现时钟滴答声效果
2017/01/29 Javascript
Jquery根据浏览器窗口改变调整大小的方法
2017/02/07 Javascript
vue-cli项目中使用echarts图表实例
2018/10/22 Javascript
10行代码实现微信小程序滑动tab切换
2018/12/28 Javascript
[04:59]2018DOTA2亚洲邀请赛 4.7 Mineski夺冠时刻
2018/04/09 DOTA
对Python3 序列解包详解
2019/02/16 Python
python隐藏终端执行cmd命令的方法
2019/06/24 Python
python批量修改图片尺寸,并保存指定路径的实现方法
2019/07/04 Python
python配置文件写入过程详解
2019/10/19 Python
django日志默认打印request请求信息的方法示例
2020/05/17 Python
Python爬虫谷歌Chrome F12抓包过程原理解析
2020/06/04 Python
详解python logging日志传输
2020/07/01 Python
浅析NumPy 切片和索引
2020/09/02 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
全网最详细的PyCharm+Anaconda的安装过程图解
2021/01/25 Python
大学生党课感想
2015/08/11 职场文书
告诉你创业计划书的8个实用技巧
2019/07/12 职场文书