pub/sub的实际应用总结
pub/sub即观察者模式,有多重表现形式
1. Publisher/Subscriber
2. Observer/Observable
3. Listener(例如EventListener)
4. EventBus
5. EventEmitter
EventBus这种不只是观察者模式,还包含了中介者模式,bus就是一个中介者,负责在消费者和生产者之间转发消息
而Observer/Observable则是一种比较纯粹的观察者模式,一个对象要发布消息时候,就可以暴露一个Observable出来,
一个想要接收消息,找到这个Observalble并且Subscribe它。
下面总结常用框架自带的pub/sub模式实现
1. jquery的Pub/Sub实现
1.1 直接注册事件的方法进行
例如,在window上注册自定义事件,由于jquery是事件支持命名空间,对pub/sub的支持更加给力。
$(window).on('topic.eventType',function(event,data){
});
$(window).trigger('topic.eventType',[data]);
1.2 使用jquery的callbacks函数
jquery自带的callbacks系列函数,就是一个优质的pub/sub的实现,直接使用即可。
var topic = $.Callbacks();
topic.add(function () { ... });
topic.fire();
也可以进行简单的封装,使其更加自然:
var topics = {};
jQuery.Topic = function( id ) {
var callbacks, method,
topic = id && topics[ id ];
if ( !topic ) {
callbacks = jQuery.Callbacks();
topic = {
publish: callbacks.fire,
subscribe: callbacks.add,
unsubscribe: callbacks.remove
};
if ( id ) {
topics[ id ] = topic;
}
}
return topic;
};
// Subscribers
$.Topic( "mailArrived" ).subscribe( fn1 );
$.Topic( "mailArrived" ).subscribe( fn2 );
$.Topic( "mailSent" ).subscribe( fn1 );
// Publisher
$.Topic( "mailArrived" ).publish( "hello world!" );
$.Topic( "mailSent" ).publish( "woo! mail!" );
具体可以参考 http://api.jquery.com/jQuery.Callbacks/
2.vue的Pub/Sub实现
由于vue实例可以监听和发布事件,其可以充当一个EventBus,就可以直接实现一个pub/sub的应用
var bus = new Vue();
bus.$on('evnetType',function(data){ });
bus.$emit('evnetType',data);
具体在vue组件中使用时候,要在组件销毁时解绑事件。
created() {
this.$bus.$on('evnet1', this.method1);
this.$bus.$on('evnet2', this.method2);
},
// 清除事件监听
beforeDestroy () {
this.$bus.$off('evnet1', this.method1);
this.$bus.$off('evnet2', this.method2);
}
当然也可以使用第三方的bus实现,省去解除绑定和使用具名函数的麻烦,例如vue-happy-bus。
bus模式只是适用于简单的组件通信,复杂的通信还是使用vuex吧
3.Node.js的Pub/Sub实现
EventEmitter
emitter.on(event, listener) //注册一个事件 emitter.once(event, listener) //注册一个一次性的事件,触发后就被抹掉 emitter.removeListener(event, listener) //在时间队列中剔除某一个事件 emitter.removeAllListeners([event]) //删除整个事件队列,或多个事件 emitter.listeners(event) //返回某些事件 emitter.emit(event, [arg1], [arg2], […]) //触发事件,可传入具体参数
在需要一些Pub/Sub实现,例如动画的执行时机在一个接口执行完之后,又需要在一个按钮点击之后,只是少量情况,但是又有需求,这种场合就非常合适。用框架自带的实现,省去了引入第三方包的麻烦。
pub/sub的实际应用总结的更多相关文章
- Mosquitto pub/sub服务实现代码浅析-主体框架
Mosquitto 是一个IBM 开源pub/sub订阅发布协议 MQTT 的一个单机版实现(目前也只有单机版),MQTT主打轻便,比较适用于移动设备等上面,花费流量少,解析代价低.相对于XMPP等来 ...
- Redis学习笔记~分布式的Pub/Sub模式
回到目录 redis的客户端有很多,这次用它的pub/sub发布与订阅我选择了StackExchange.Redis,发布与订阅大家应该很清楚了,首先一个订阅者,订阅一个服务,服务执行一些处理程序(可 ...
- 使用Service.Stack客户端编写redis pub sub的方法
pub相对简单 client.PublishMessage("channel", "msg"); sub有2种方法 方法1 var subscription ...
- 【转】 使用Redis的Pub/Sub来实现类似于JMS的消息持久化
http://blog.csdn.net/canot/article/details/52040415 关于个人对Redis提供的Pub/Sub机制的认识在上一篇博客中涉及到了,也提到了关于如何避免R ...
- Redis 命令 - Pub/Sub
PSUBSCRIBE pattern [pattern ...] Listen for messages published to channels matching the given patter ...
- SecureCRT+WinSCP 共用 key pub 密钥 转换 ppk 登录ssh
使用SecureCRT生成的密钥,无法在WinSCP使用, 使用puttygen.exe无法直接转换,解决办法 1.使用大于等于SecureCRT6.5版本,来转换 记得放入私钥,不是pub公钥.然后 ...
- Spring mvc Data Redis—Pub/Sub(附Web项目源码)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
- git的id_rsa.pub的生成(也就是github上的SSH Keys)
只需要一条语句就可以实现生成id_rsa.pub和id_rsa的目的:ssh-keygen -t rsa -C your_email 注意:这个邮箱是你github上的邮箱.只有在gthub上添加了这 ...
- Redis教程03——Redis 发布/订阅(Pub/Sub)
Pub/Sub 订阅,取消订阅和发布实现了发布/订阅消息范式(引自wikipedia),发送者(发布者)不是计划发送消息给特定的接收者(订阅者).而是发布的消息分到不同的频道,不需要知道什么样的订阅者 ...
- Spring Data Redis—Pub/Sub(附Web项目源码)
一.发布和订阅机制 当一个客户端通过 PUBLISH 命令向订阅者发送信息的时候,我们称这个客户端为发布者(publisher). 而当一个客户端使用 SUBSCRIBE 或者 PSUBSCRIBE ...
随机推荐
- 全文检索(Lucene&Solr)
全文检索(Lucene&Solr) 1)什么是全文检索?为什么需要全文检索? 结构化数据(mysql等)方便查询,而非结构化数据(如多篇文章)是难以查询到自己需要的,所以要使用全文检索. 全文 ...
- js将人民币数字转大写
function numberToUpper(money) { var cnNums = new Array("零", "壹", "贰", ...
- logrus学习笔记
logrus源码:https://github.com/sirupsen/logrus 1.logrus.Entry结构 1.1 类型 type Entry struct { Logger *Logg ...
- pwn的一些环境搭建
<1>pwntools库安装 pwntools是一个CTF框架和漏洞利用开发库,用Python开发,由rapid设计,旨在让使用者简单快速的编写exploit. 本文将基于KUbuntu ...
- 【jQuery】input框输入手机号自动填充空格
<input type="tel" id="tel"> $("#tel").keyup(function(){ _self = ...
- 腾讯首页分辨手机端与pc端代码
腾讯首页分辨手机端与pc端代码 自己在做网页的时候在腾讯网首页借鉴的代码. 代码: <!-- 移动适配JS脚本 --> <script type="text/javascr ...
- manjaro安装teamviewer实现远程连接
不要安装库里面的这两个版本,安装后桌面快捷方式和命令行运行都正常显示窗口,但没有teamviewer ID和随机密码 12.x版本也不用下载尝试了 ➜ ~ teamviewer Init...Chec ...
- 8,实例化Flask的参数 及 对app的配置
Flask 是一个非常灵活且短小精干的web框架 , 那么灵活性从什么地方体现呢? 有一个神奇的东西叫 Flask配置 , 这个东西怎么用呢? 它能给我们带来怎么样的方便呢? 首先展示一下: from ...
- java练习题——字符串
一.动手动脑之String.equals()方法: 判断s1和s2的内容相同s1.equals(s2). 判断s1和s2的地址相同s1 == s2. 二.整理String类的Length().char ...
- 51Nod 1680 区间求和 树状数组
题意: 给出一个长度为\(n\)的数列\(A_i\),定义\(f(k)\)为所有长度大于等于\(k\)的子区间中前\(k\)大数之和的和. 求\(\sum_{k=1}^{n}f(k) \; mod \ ...