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实现计算代码行数的简单方法附代码
Aug 13 Javascript
jQuery如何将选中的对象转化为原始的DOM对象
Jun 09 Javascript
JS实现将Asp.Net的DateTime Json类型转换为标准时间的方法
Aug 02 Javascript
js判断checkbox是否选中个数的方法(超简单)
Aug 19 Javascript
详解webpack+express多页站点开发
Dec 22 Javascript
基于 Vue.js 2.0 酷炫自适应背景视频登录页面实现方式
Jan 17 Javascript
360doc网站不登录就无法复制内容的解决方法
Jan 27 Javascript
Angular动画实现的2种方式以及添加购物车动画实例代码
Aug 09 Javascript
React注册倒计时功能的实现
Sep 06 Javascript
elementUI中Table表格问题的解决方法
Dec 04 Javascript
使用vue实现各类弹出框组件
Jul 03 Javascript
微信小程序页面间传递数组对象方法解析
Nov 06 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
星际初学者游戏中永远要做的事
2020/03/04 星际争霸
PHP 根据IP地址控制访问的代码
2010/04/22 PHP
解析PHP的Yii框架中cookie和session功能的相关操作
2016/03/17 PHP
PHP+Jquery与ajax相结合实现下拉淡出瀑布流效果【无需插件】
2016/05/06 PHP
php使用filter_var函数判断邮箱,url,ip格式示例
2019/07/06 PHP
Laravel 实现关系模型取出需要的字段
2019/10/10 PHP
JS判断是否为数字,是否为整数,是否为浮点数的代码
2010/04/24 Javascript
Jquery Ajax的Get方式时需要注意URL地方
2011/04/07 Javascript
兼容IE和Firefox的javascript获取iframe文档内容的函数
2011/08/15 Javascript
原生javascript实现图片弹窗交互效果
2015/01/12 Javascript
javascript实现动态加载CSS
2015/01/26 Javascript
javascript将异步校验表单改写为同步表单
2015/01/27 Javascript
AngularJS表单编辑提交功能实例
2015/02/13 Javascript
js确认框confirm()用法实例详解
2016/01/07 Javascript
基于Bootstrap实现Material Design风格表单插件 附源码下载
2016/04/18 Javascript
JavaScript使用Range调色及透明度实例
2016/09/25 Javascript
Bootstrap基本插件学习笔记之Tooltip提示工具(18)
2016/12/08 Javascript
浅谈JavaScript中promise的使用
2017/01/11 Javascript
bootstrap组件之导航组件使用方法
2017/01/19 Javascript
Angular2学习教程之组件中的DOM操作详解
2017/05/28 Javascript
详解javascript replace高级用法
2019/02/17 Javascript
深入剖析JavaScript instanceof 运算符
2019/06/14 Javascript
在layui下对元素进行事件绑定的实例
2019/09/06 Javascript
vue父子组件间引用之$parent、$children
2020/05/20 Javascript
解决vue一个页面中复用同一个echarts组件的问题
2020/07/19 Javascript
vue+springboot+element+vue-resource实现文件上传教程
2020/10/21 Javascript
python flask解析json数据不完整的解决方法
2019/05/26 Python
解决Djang2.0.1中的reverse导入失败的问题
2019/08/16 Python
python脚本后台执行方式
2019/12/21 Python
python 解决cv2绘制中文乱码问题
2019/12/23 Python
python3.6环境下安装freetype库和基本使用方法(推荐)
2020/05/10 Python
关于h5中的fetch方法解读(小结)
2017/11/15 HTML / CSS
乡镇党员干部四风对照检查材料思想汇报
2014/09/27 职场文书
鲁冰花观后感
2015/06/10 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python
mysql 联合索引生效的条件及索引失效的条件
2021/11/20 MySQL