发布订阅模式
时间:2021-08-23
本文章向大家介绍发布订阅模式,主要包括发布订阅模式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
本文的创作启发来自于Vue中的EventBus(也有人叫中央事件总线),全文系博主原创,转载请标明出处,如有理解不当之处欢迎各位大佬赐教,谢谢!
本文代码秉承发布订阅模式的思想模拟实现了 Vue中的EvnetBus
那么,上代码!
JS版
class Subscription {
subscriptionStack = {};
on(eventName, callBack) {
if (this.subscriptionStack[eventName]) {
this.subscriptionStack[eventName].callBacks.push(callBack);
callBack(this.subscriptionStack[eventName].value);
} else {
console.error("该接口未注册,请先通过emit方法注册接口,再来监听")
return;
}
}
emit(eventName, value) {
if (this.subscriptionStack[eventName]) {
Reflect.set(this.subscriptionStack[eventName], 'value', value);
} else {
const origin = {
value,
callBacks: []
}
const proxyHandle = {
get(origin, key) {
return origin[key];
},
set(origin, key, value) {
if (key == 'value' && origin.callBacks.length) {
origin.callBacks.forEach(callBack => {
callBack(value);
})
}
}
}
this.subscriptionStack[eventName] = new Proxy(origin, proxyHandle);
}
}
}
Ts版
interface SubscriptionClassInterface {
subscriptionStack: object;
on(eventName: string, callBack: (val: any) => void): void;
emit(eventName: string, value: any): void;
}
class Subscription implements SubscriptionClassInterface {
subscriptionStack: object;
on: (eventName: string, callBack: (val: any) => void) => void;
emit: (eventName: string, value: any) => void;
constructor() {
this.subscriptionStack = {};
this.on = (eventName: string, callBack: (val: any) => void) => {
if (this.subscriptionStack[eventName]) {
this.subscriptionStack[eventName].callBacks.push(callBack);
callBack(this.subscriptionStack[eventName].value);
} else {
console.error("该接口未注册,请先通过emit方法注册接口,再来监听");
return;
}
};
this.emit = (eventName: string, value: any) => {
if (this.subscriptionStack[eventName]) {
Reflect.set(this.subscriptionStack[eventName], "value", value);
} else {
const origin = {
value,
callBacks: [],
};
const proxyHandle = {
get(origin, key): any {
return origin[key];
},
set(origin, key, value): any {
if (key == "value" && origin.callBacks.length) {
origin.callBacks.forEach((callBack) => {
callBack(value);
});
}
},
};
this.subscriptionStack[eventName] = new Proxy(origin, proxyHandle);
}
};
}
}
使用方法:
第一步、
# 创建实例
let s = new Subscription();
第二步、
# 发布事件
s.emit(事件名,值)
# 举个栗子:
s.emit('change',20);
第三步、
# 订阅事件
s.on(事件名,回调函数)
> 此处的事件名一定要和emit中的对应上
# 举个栗子:
s.on('change',function(val){
//emit中传入的值在Val中接收到
//这里可以写入相应的逻辑代码
//每当再次调用emit这个回调函数会被自动调用,完成响应式
})
------------------------- End -------------------------
原文地址:https://www.cnblogs.com/fuyouplus/p/15175412.html
- 通过html<map>标签给图片加链接
- Windows下安装Scikit-Learn
- 解决后台无法进入提示DedeCMS Error: (PHP 5.3 and above) Please set 'request_order' ini value
- 一文教你实现skip-gram模型,训练并可视化词向量
- 如何将文章列表用<li>分两列显示
- 面试题之走楼梯问题
- 最长公共子序列与最长公共子串
- nodejs 的序列化与反序列化
- dedecms获取当前文章所在栏目URL
- highcharts 时间少8小时问题
- 【干货】python玩转微信:微信好友统计信息全掌握
- 使用Visual Studio 调试断点不起作用的问题解决办法 调试Revit CAD 不能进入断点
- openFileDialog的Filter属性设置
- dedecms调用当前栏目的子栏目怎么操作
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- [Jmeter]---JsonPath表达式提取响应&断言
- envoy filter 开发实践系列 2:官网 http filter 示例编译测试
- 快速入门ElasticSearch
- 如何用 JS 一次获取 HTML 表单的所有字段 ?
- Docker与容器
- Go 每日一库之 air
- Go 每日一库之 goquery
- 个人电脑也做做宏基因组玩玩
- windows 安装 miniconda3 +jupyter lab ,使用系统R语言
- Mysql获取数据的总行数count(*)很慢
- 并发编程问题为什么都很诡异
- 6轮Jmeter压测对比keep-alive的影响
- 多个你不知道的 CSS 居中方案!
- 深入理解Pod(二)
- JavaScript 中 10 个需要掌握基础的问题