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 相关文章推荐
ExtJS 工具栏 分页事件参数
Mar 05 Javascript
Jquery插件之打造自定义的select标签
Nov 30 Javascript
javascript操作excel生成报表全攻略
May 04 Javascript
微信企业号开发之微信考勤百度地图定位
Sep 11 Javascript
JavaScript动态添加css样式和script标签
Jul 19 Javascript
浅析jsopn跨域请求原理及cors(跨域资源共享)的完美解决方法
Feb 06 Javascript
js实现动态显示时间效果
Mar 06 Javascript
jQuery Ajax前后端使用JSON进行交互示例
Mar 17 Javascript
jQuery模拟12306城市选择框功能简单实现方法示例
Aug 13 jQuery
小程序富文本提取图片可放大缩小
May 26 Javascript
vue 弹出遮罩层样式实例
Jul 22 Javascript
vue实现几秒后跳转新页面代码
Sep 09 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
全国FM电台频率大全 - 14 江西省
2020/03/11 无线电
利用php来自动调用不同服务器上的flash
2006/10/09 PHP
php不使用插件导出excel的简单方法
2014/03/04 PHP
PHP微信网页授权的配置文件操作分析
2019/05/29 PHP
Js 中debug方式
2010/02/07 Javascript
javascript 使td内容不换行不撑开
2012/11/29 Javascript
Javascript基础_标记文字的实现方法
2016/06/14 Javascript
移动端js触摸事件详解
2016/09/18 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
浅谈jQuery中Ajax事件beforesend及各参数含义
2016/12/03 Javascript
javascript实现Emrips反质数枚举的示例代码
2017/12/06 Javascript
详解Vue中watch对象内属性的方法
2019/02/01 Javascript
JavaScript生成一个不重复的ID的方法示例
2019/09/16 Javascript
python中合并两个文本文件并按照姓名首字母排序的例子
2014/04/25 Python
Python+Selenium+PIL+Tesseract自动识别验证码进行一键登录
2017/09/20 Python
Python编程pygame模块实现移动的小车示例代码
2018/01/03 Python
浅析Python函数式编程
2018/10/06 Python
windows下 兼容Python2和Python3的解决方法
2018/12/05 Python
对DataFrame数据中的重复行,利用groupby累加合并的方法详解
2019/01/30 Python
Django Channels 实现点对点实时聊天和消息推送功能
2019/07/17 Python
tensorflow如何批量读取图片
2019/08/29 Python
Django 框架模型操作入门教程
2019/11/05 Python
五种Python转义表示法
2020/11/27 Python
Python脚本调试工具安装过程
2021/01/11 Python
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
雅诗兰黛澳大利亚官网:Estée Lauder澳大利亚
2019/05/31 全球购物
美国木工工具和用品商店:Woodcraft
2019/10/30 全球购物
写给妈妈的道歉信
2014/01/11 职场文书
个人合作协议书范本
2014/04/18 职场文书
三八红旗集体先进事迹材料
2014/05/22 职场文书
人事专员岗位说明书
2014/07/29 职场文书
学前教育专业求职信
2014/09/02 职场文书
副检察长四风问题对照检查材料思想汇报
2014/10/07 职场文书
2014年公务员工作总结
2014/11/18 职场文书
还在手动盖楼抽奖?教你用Python实现自动评论盖楼抽奖(一)
2021/06/07 Python
SQL注入详解及防范方法
2021/12/06 MySQL