理解并实现 你自己的 订阅-发布模式
订阅发布模式:
这是一种广泛应用于异步编程的模式,是回调函数的事件化,常常用来解耦业务逻辑。事件的发布者无需关注订阅的侦听器如何实现业务逻辑,甚至不用关注有多少个侦听器存在。数据通过消息的方式可以灵活的传递。 ——《深入浅出Nodejs》
由于浏览器js单线程的原因,编写js代码经常会用到异步,回调函数 , 业内解决 异步比较流行的方式 订阅发布模式、 promise 、async/await 。
例如 promise 我们都是在then 函数中传入回调函数, 传入之后发生了什么。。。为什么回调没有立即执行 而是等状态发生后执行的,同一个promise 实例 注册多个then函数, 为什么可以依次执行。。。很多主流的库或框架 也用的订阅发布模式,例如 mobx vue . 所以有必要 总结下原理,相信你看完本文, 收获颇多。
下面我们可以构造下事件类 需要包含下面的 内容:
subscribers
:一个对象,其中每个属性(订阅的事件类型),对应一个数组,存储订阅者(同一个事件类型可能有多个订阅者,故放到数组中保存)
subscribe()
:注册/订阅,将订阅者添加到 subscribers 数组中;
unsubscribe()
:取消订阅。从 subscribers 数组中删除订阅者;
publish()
:循环遍历 subscribers 数组中的每一个元素,并且调用它们注册时所提供的方法;
所有这三种方法都需要一个 type 参数。这是因为发布者可能触发多个事件(比如同时发布一本杂志和一份报纸)
class Publisher {constructor(){this.subscribers={}
}subscribe(type,fn){// 将订阅的事件回调保存到if (typeof fn !=='function'){throw new Error (`${fn} is not a function`)
}if(!this.subscribers[type]){this.subscribers[type] = []}this.subscribers[type].push(fn);
}unsubscribe(type,fn){this.subscribers[type]=this.subscribers[type].filter(item=>item!==fn)}publish(type,...params){if(!this.subscribers[type])return;this.subscribers[type].forEach(item=>item(...params));
}static makePublisher (obj){obj.publisher = new Publisher(); // 创建一个发布者 }}function fn1(name){
console.log(`hello,my name is ${name}`);
}function meet(){
console.log('nice to meet you ');
}function fn2 (age){console.log(`hello , I am ${age} years old!`);
}var people= {};Publisher.makePublisher(people);people.publisher.subscribe('name',fn1);people.publisher.subscribe('name',meet);people.publisher.unsubscribe('name',meet);people.publisher.subscribe('age',fn2);people.publisher.publish('name','Tom');
people.publisher.publish('age',30);//hello,my name is Tom
// hello , I am 30 years old!
理解并实现 你自己的 订阅-发布模式相关推荐
- RabbitMQ下的生产消费者模式与订阅发布模式
所谓模式,就是在某种场景下,一类问题及其解决方案的总结归纳.生产消费者模式与订阅发布模式是使用消息中间件时常用的两种模式,用于功能解耦和分布式系统间的消息通信,以下面两种场景为例: 数据接入 假 ...
- Publisher/Subscriber 订阅-发布模式原理解析
Publisher/Subscriber 订阅-发布模式原理解析 参考资料 What Is Pub/Sub? Publish/Subscribe Messaging Explained 什么是serv ...
- Java设计模式-观察者模式(订阅发布模式)
Java设计模式-观察者模式(订阅发布模式) 一起来看 会了就当复习丫,不会来一起来看看吧. 很喜欢一句话:"八小时内谋生活,八小时外谋发展". 如果你也喜欢,让我们一起坚持吧!! ...
- 4 交换机-fanout(订阅发布模式)
目录 订阅发布模式 1.交换器(Exchange) 1.1.创建交换器 1.2 .推送消息到交换器 2.临时队列 3.绑定(bingdings) 5.代码例子 5.1.生产者代码示例 5.2.消费者代 ...
- Redis实现消息队列和订阅发布模式
转载:https://www.cnblogs.com/qlqwjy/p/9763754.html 在项目中用到了redis作为缓存,再学习了ActiveMq之后想着用redis实现简单的消息队列,下面 ...
- 嵌入式消息订阅发布模式软件框架
文章目录 一.总体框架 二.基于RT-Thread的SoftBus 2.1 SoftBus的由来 2.2 消息订阅者模式 2.3 静态订阅关系与动态订阅关系 2.4 C/S模式 2.5 消息订阅者模式 ...
- java订阅发布模式_Spring Boot ActiveMQ发布/订阅消息模式原理解析
本文在<Spring Boot基于Active MQ实现整合JMS>的基础上,介绍如何使用ActiveMQ的发布/订阅消息模式.发布/订阅消息模式是消息发送者发送消息到主题(topic), ...
- js设计模式之观察者模式和订阅发布模式
观察者模式 这个模式在我看来原理就是发布者身上放着一个电话本(list)存着订阅者的l联系方式(回调函数),在触发条件(发布)后就会依次联系(遍历调用list中的回调函数)订阅者 上代码: funct ...
- 报纸的配送方式:订阅发布模式
这种设计模式比较简单,属于一对多.类似顾客与报社的关系,顾客订阅报纸,每当有新闻发布时快递员一一给订阅报纸的顾客配送 下面是代码实现 两个接口 /*** 被观察者** Created by Vola ...
最新文章
- SharePoint2010 -- 管理配置文件同步
- .NET中如何得到图片大小
- 批量下载的实现及java.lang.IllegalStateException异常
- MEET 2021 | 人工智能产业、科研、投资届大咖齐聚,共探智能科技新机会
- haproxy服务启动命令_HaProxy安装和常用命令
- 【NLP】一行Python代码中自动化文本处理
- HDU - 3613 Best Reward(字符串哈希)
- ecshop 收货人信息电话必填改为手机必填
- fglrx 9.8与kernel 2.6.30
- STL模型文件修改软件magics 21.0的安装及使用
- 【老生谈算法】matlab实现傅里叶变换算法源码——傅里叶变换
- linux下 Wowza安装与ffmpeg测试
- 占位智能家居市场,施耐德电气仅靠一个Wiser系统?
- 脖子黑色素沉淀怎么去除,有效方法
- Python装逼指南——五行代码实现批量抠图!
- [企业管理]宽容与尊严
- 扇贝开发:国内NFT平台运营主要合规问题
- Android 手势小试牛刀
- u-boot的usb模块初始化
- Hello MySQL(十三)——事务和锁