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 相关文章推荐
兼容IE和FF的js脚本代码小结(比较常用)
Dec 06 Javascript
Jquery中获取iframe的代码
Jan 11 Javascript
Draggable Elements 元素拖拽功能实现代码
Mar 30 Javascript
jQuery点击后一组图片左右滑动的实现代码
Aug 16 Javascript
JavaScript设计模式之策略模式实例
Oct 10 Javascript
JavaScript实现判断图片是否加载完成的3种方法整理
Mar 13 Javascript
php常见的页面跳转方法汇总
Apr 15 Javascript
jQuery三级下拉列表导航菜单代码分享
Apr 15 Javascript
jQuery实现的自定义弹出层效果实例详解
Sep 04 Javascript
axios的拦截请求与响应方法
Aug 11 Javascript
JavaScript基于数组实现的栈与队列操作示例
Dec 22 Javascript
Vue CLI3.0中使用jQuery和Bootstrap的方法
Feb 28 jQuery
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实现的支持imagemagick及gd库两种处理的缩略图生成类
2014/09/23 PHP
php使用curl伪造来源ip和refer的方法示例
2018/05/08 PHP
Yii2.0框架behaviors方法使用实例分析
2019/09/30 PHP
TextArea 控件的最大长度问题(js json)
2009/12/16 Javascript
CSS和Javascript简单复习资料
2010/06/29 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
下拉菜单点击实现连接跳转功能的js代码
2013/05/19 Javascript
js select option对象小结
2013/12/20 Javascript
JavaScript的9种继承实现方式归纳
2015/05/18 Javascript
JavaScript学习笔记之检测客户端类型是(引擎、浏览器、平台、操作系统、移动设备)
2015/12/03 Javascript
基于JavaScript实现类似于百度学术高级检索功能
2016/03/02 Javascript
javascript Promise简单学习使用方法小结
2016/05/17 Javascript
详解React-Todos入门例子
2016/11/08 Javascript
详解Nodejs之静态资源处理
2017/06/05 NodeJs
详解Node.js 命令行程序开发教程
2017/06/07 Javascript
js es6系列教程 - 新的类语法实战选项卡(详解)
2017/09/02 Javascript
vue 全选与反选的实现方法(无Bug 新手看过来)
2018/02/09 Javascript
Vue结合Video.js播放m3u8视频流的方法示例
2018/05/04 Javascript
Vue瀑布流插件的使用示例
2018/09/19 Javascript
微信小程序 授权登录详解(附完整源码)
2019/08/23 Javascript
这样回答继承可能面试官更满意
2019/12/10 Javascript
Javascript数组及类数组相关原理详解
2020/10/29 Javascript
[01:15:44]首部DOTA2纪录片今日23时全网上映
2014/03/19 DOTA
[03:47]2015国际邀请赛第三日现场精彩回顾
2015/08/08 DOTA
python访问sqlserver示例
2014/02/10 Python
跟老齐学Python之集合(set)
2014/09/24 Python
Python实现Linux中的du命令
2017/06/12 Python
浅谈python配置与使用OpenCV踩的一些坑
2018/04/02 Python
Python3实现的字典遍历操作详解
2018/04/18 Python
Django错误:TypeError at / 'bool' object is not callable解决
2019/08/16 Python
基于python实现计算且附带进度条代码实例
2020/03/31 Python
丝芙兰新加坡官网:Sephora新加坡
2018/12/04 全球购物
数据库面试要点基本概念
2013/10/31 面试题
优秀毕业生求职信范文
2014/01/02 职场文书
谢师宴学生致辞
2015/07/27 职场文书
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB