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对象的代码分享
Nov 02 Javascript
Extjs Gird 支持中文拼音排序实现代码
Apr 15 Javascript
js控制input输入字符解析
Dec 27 Javascript
JS判断客户端是手机还是PC的2个代码
Apr 12 Javascript
jQuery制作效果超棒的手风琴折叠菜单
Apr 03 Javascript
深入浅析JS的数组遍历方法(推荐)
Jun 15 Javascript
完美解决input[type=number]无法显示非数字字符的问题
Feb 28 Javascript
解决vue.js在编写过程中出现空格不规范报错的问题
Sep 20 Javascript
微信小程序 自定义复选框实现代码实例
Sep 04 Javascript
关于JS解构的5种有趣用法
Sep 05 Javascript
JavaScript实现简单的计算器
Jan 16 Javascript
vue使用swiper实现左右滑动切换图片
Oct 16 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
B2K与车机的中波PK
2021/03/02 无线电
PHP4和PHP5共存于一系统
2006/11/17 PHP
PHP+jQuery+Ajax实现分页效果 jPaginate插件的应用
2015/10/09 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
php中文语义分析实现方法示例
2019/09/28 PHP
jQuery ajax serialize()方法的使用以及常见问题解决
2013/01/27 Javascript
用js实现trim()的解决办法
2013/04/16 Javascript
JS小功能(onmouseover实现选择月份)实例代码
2013/11/28 Javascript
js+css实现tab菜单切换效果的方法
2015/01/20 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
jQuery实现移动端滑块拖动选择数字效果
2015/12/24 Javascript
深入浅析AngularJS中的module(模块)
2016/01/04 Javascript
JS定时器使用,定时定点,固定时刻,循环执行详解
2016/05/31 Javascript
基于JavaScript 性能优化技巧心得(分享)
2017/12/11 Javascript
对vuejs的v-for遍历、v-bind动态改变值、v-if进行判断的实例讲解
2018/08/27 Javascript
vue中多个倒计时实现代码实例
2019/03/27 Javascript
通过实例讲解JS如何防抖动
2019/06/15 Javascript
用实例解释Python中的继承和多态的概念
2015/04/27 Python
python3新特性函数注释Function Annotations用法分析
2016/07/28 Python
python使用matplotlib绘制折线图教程
2017/02/08 Python
通过Python 获取Android设备信息的轻量级框架
2017/12/18 Python
python3.x上post发送json数据
2018/03/04 Python
Python列表原理与用法详解【创建、元素增加、删除、访问、计数、切片、遍历等】
2019/10/30 Python
如何解决tensorflow恢复模型的特定值时出错
2020/02/06 Python
Python打印不合法的文件名
2020/07/31 Python
css3中background新增的4个新的相关属性用法介绍
2013/09/26 HTML / CSS
欧姆龙医疗欧洲有限公司:Omron Healthcare Europe B.V
2020/06/13 全球购物
与UNIX有关的几个名词
2015/09/17 面试题
秋天的雨教学反思
2014/04/27 职场文书
临床医学生职业规划书范文
2014/10/25 职场文书
2014年工会工作总结
2014/11/12 职场文书
2016大学自主招生推荐信范文
2015/03/23 职场文书
鲁滨孙漂流记读书笔记
2015/06/30 职场文书
2015中秋节晚会主持词
2015/07/01 职场文书
开学随笔
2015/08/15 职场文书
简历上的自我评价,该怎么写呢?
2019/06/13 职场文书