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 相关文章推荐
Jqyery中同等与js中windows.onload的应用
May 10 Javascript
ajax不执行success回调而是执行了error回调
Dec 10 Javascript
JavaScript事件 "事件对象"的注意要点
Jan 14 Javascript
JS获取CSS样式(style/getComputedStyle/currentStyle)
Jan 19 Javascript
JavaScript事件学习小结(一)事件流
Jun 09 Javascript
Javascript 创建类并动态添加属性及方法的简单实现
Oct 20 Javascript
js实现返回顶部效果
Mar 10 Javascript
xmlplus组件设计系列之图标(ICON)(1)
May 05 Javascript
jQuery绑定事件方法及区别(bind,click,on,live,one)
Aug 14 jQuery
jquery动态赋值id与动态取id方法示例
Aug 21 jQuery
javascript实现电脑和手机版样式切换
Nov 10 Javascript
微信小程序实现日历功能
Nov 27 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转换文件夹下所有文件编码的实现代码
2013/06/06 PHP
浅析PKI加密解密 OpenSSL
2013/07/01 PHP
PHP读取PPT文件的方法
2015/12/10 PHP
php设计模式之单例模式代码
2016/06/11 PHP
PHP实现限制IP访问及提交次数的方法详解
2017/07/17 PHP
PHP实现的多维数组去重操作示例
2018/07/21 PHP
JavaScript 获取当前时间戳的代码
2010/08/05 Javascript
js限制文本框为整数和货币的函数代码
2010/10/13 Javascript
javascript 数组排序函数sort和reverse使用介绍
2013/11/21 Javascript
使用jQuery简单实现模拟浏览器搜索功能
2014/12/21 Javascript
jQuery中unbind()方法用法实例
2015/01/19 Javascript
JavaScript基础知识点归纳(推荐)
2016/07/09 Javascript
js实现canvas保存图片为png格式并下载到本地的方法
2017/08/31 Javascript
Vue.js子组件向父组件通信的方法实例代码详解
2018/12/10 Javascript
Vue源码学习之关于对Array的数据侦听实现
2019/04/23 Javascript
用vscode开发vue应用的方法步骤
2019/05/06 Javascript
layui table设置某一行的字体颜色方法
2019/09/05 Javascript
vue中选中多个选项并且改变选中的样式的实例代码
2020/09/16 Javascript
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
[53:15]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS OG
2018/03/30 DOTA
python脚本实现查找webshell的方法
2014/07/31 Python
新手如何快速入门Python(菜鸟必看篇)
2017/06/10 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
python读取中文txt文本的方法
2018/04/12 Python
Python 实现取矩阵的部分列,保存为一个新的矩阵方法
2018/11/14 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
Python实现程序判断季节的代码示例
2019/01/28 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
Python logging设置和logger解析
2019/08/28 Python
用python求一重积分和二重积分的例子
2019/12/06 Python
Nike法国官方网站:Nike.com FR
2018/07/22 全球购物
俄罗斯美容和健康网上商店:Созвездие Красоты
2019/07/23 全球购物
银行授权委托书样本
2014/10/13 职场文书
什么是创业计划书?什么是商业计划书?这里一一解答
2019/07/12 职场文书
浅谈node.js中间件有哪些类型
2021/04/29 Javascript
Jupyter notebook 不自动弹出网页的解决方案
2021/05/21 Python