Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端PubSub模式简单实现

前端PubSub模式简单实现

作者头像
IMWeb前端团队
发布于 2019-12-04 05:12:08
发布于 2019-12-04 05:12:08
70500
代码可运行
举报
文章被收录于专栏:IMWeb前端团队IMWeb前端团队
运行总次数:0
代码可运行

本文作者:IMWeb 邝伟科 原文出处:IMWeb社区 未经同意,禁止转载

PubSub是一种设计模式,中文叫发布订阅模式,简单来说就是消息发布者不直接向订阅者发布消息,而是发布到中介,而中介根据不同主题对消息进行过滤,并通知对该主题感兴趣的订阅者。该模式在前端现在很火的组件化开发十分常用,因为该模式松耦合,易于扩展的优点正式组件化开发所需要的。

一个PubSub模型主要方法有3个,订阅,退订,发布,下面尝试在前端实现一个最简单的PubSub模块。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var PubSub = {};
// 用于储存事件队列
var queue = {};

// 订阅接口
PubSub.on = function(event, cb) {
  if (!queue[event]) {
    queue[event] = [];
  }
  queue[event].push(cb);
};

// 退订接口
PubSub.off = function(event, cb) {
  var currentEvent = queue[event];
  var len = 0;
  if (currentEvent) {
    len = currentEvent.length;
    for (var i = len - 1; i >= 0; i--) {
      if (currentEvent[i] === cb) {
        currentEvent.splice(i, 1);
      }
    }
  }
};

// 发布接口
PubSub.emit = function(event) {
  var currentEvent = queue[event];
  if (currentEvent) {
    for (var i = 0; i < currentEvent.length; i++) {
      currentEvent[i]();
    }
  }
};

使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 订阅
var callbackA = function () {
    console.log('event a happened')
};
PubSub.on('a', callbackA);
PubSub.on('b', function() {
    console.log('event b happened')
});

// 退订 , 第二个参赛传入回调函数的引用
PubSub.off('a', callbackA);

// 发布
PubSub.emit('a');
PubSub.emit('b');

当然,重复发明轮子的事情还是不要做了,前端目前已经有比较成熟的PubSub库,其中用的最多的应该eventemitter2,感兴趣的同学可以去了解下。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-12-02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入理解JS异步编程二(分布式事件)
版权声明:本文为吴孔云博客原创文章,转载请注明出处并带上链接,谢谢。 https://blog.csdn.net/wkyseo/article/details/51539245
空空云
2018/09/27
5020
深入学习 Node.js EventEmitter
观察者模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。
阿宝哥
2019/11/06
1.1K0
深入学习 Node.js EventEmitter
从发布订阅模式入手读懂Node.js的EventEmitter源码
前面一篇文章setTimeout和setImmediate到底谁先执行,本文让你彻底理解Event Loop详细讲解了浏览器和Node.js的异步API及其底层原理Event Loop。本文会讲一下不用原生API怎么达到异步的效果,也就是发布订阅模式。发布订阅模式在面试中也是高频考点,本文会自己实现一个发布订阅模式,弄懂了他的原理后,我们就可以去读Node.js的EventEmitter源码,这也是一个典型的发布订阅模式。
蒋鹏飞
2020/10/15
9410
从发布订阅模式入手读懂Node.js的EventEmitter源码
[源码解读]一文彻底搞懂Events模块
发布/订阅者模式应该是我在开发过程中遇到的最多的设计模式。发布/订阅者模式,也可以称之为消息机制,定义了一种依赖关系,这种依赖关系可以理解为 1对N (注意:不一定是1对多,有时候也会1对1哦),观察者们同时监听某一个对象相应的状态变换,一旦变化则通知到所有观察者,从而触发观察者相应的事件,该设计模式解决了主体对象与观察者之间功能的 耦合。
coder_koala
2019/09/05
8980
[源码解读]一文彻底搞懂Events模块
发布订阅模式,在工作中它的能量超乎你的想象
其实在早期还是用jq开发的时代,有很多地方,我们都会出现发布订阅的影子,例如有trigger和on方法
桃翁
2019/09/26
6080
发布订阅模式,在工作中它的能量超乎你的想象
js发布订阅
发布-订阅模式其实是一种对象间一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都将得到状态改变的通知。
kif
2023/03/10
1.6K0
面试官问发布订阅模式是在问什么?
本文来自 @simonezhou 小姐姐投稿的第八期笔记。面试官常问发布订阅、观察者模式,我们日常开发也很常用。文章讲述了 mitt、tiny-emitter、Vue eventBus这三个发布订阅、观察者模式相关的源码。
若川
2021/11/18
9420
面试官问发布订阅模式是在问什么?
谈谈观察者模式和发布订阅模式
参考学习: https://juejin.im/post/5a14e9edf265da4312808d86 https://molunerfinn.com/observer-vs-pubsub-pattern https://juejin.im/post/5bb1bb616fb9a05d2b6dccfa https://juejin.im/post/57de12355bbb50005e648bd8
Ewall
2020/04/10
1.2K0
谈谈观察者模式和发布订阅模式
从一道面试题简单谈谈发布订阅和观察者模式
今天的话题是javascript中常被提及的「发布订阅模式和观察者模式」,提到这,我不由得想起了一次面试。记得在去年的一次求职面试过程中,面试官问我,“你在项目中是怎么处理非父子组件之间的通信的?”。我答道,“有用到vuex,有的场景也会用EventEmitter2”。面试官继续问,“那你能手写代码,实现一个简单的EventEmitter吗?”
程序员白彬
2020/07/10
1K0
从一道面试题简单谈谈发布订阅和观察者模式
深入理解JavaScript系列(32):设计模式之观察者模式
观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自动更新自己。
用户4962466
2020/01/07
4640
《深入浅出Node.js》:Node异步编程解决方案 之 事件发布-订阅模式
灵活掌握函数式编程,异步编程就有了得心应手的基础。之所以说是基础,是还需要对异步的编程思路有清晰的认识。
前端_AWhile
2019/08/29
1.4K0
《深入浅出Node.js》:Node异步编程解决方案 之 事件发布-订阅模式
如果面试官让你讲讲发布订阅设计模式?
有小伙伴问,该如何学习设计模式,设计模式本身是一些问题场景的抽象解决方案,死记硬背肯定不行,无异于搭建空中楼阁,所以得结合实际,从解决问题角度去思考、举一反三,如此便能更轻松掌握知识点。
小东同学
2022/07/29
2.7K0
如果面试官让你讲讲发布订阅设计模式?
JavaScript 设计模式学习第十八篇-发布-订阅模式
在众多设计模式中,可能最常见、最有名的就是发布 - 订阅模式了,本篇我们一起来学习这个模式。
越陌度阡
2020/11/26
1.1K0
JavaScript 设计模式学习第十八篇-发布-订阅模式
框架源码中用来提高扩展性的设计模式
我们写的代码都是为了一定的需求服务的,但是这些需求并不是一成不变的,当需求变更了,如果我们代码的扩展性很好,我们可能只需要简单的添加或者删除模块就行了,如果扩展性不好,可能所有代码都需要重写,那就是一场灾难了,所以提高代码的扩展性是势在必行的。怎样才算有好的扩展性呢?好的扩展性应该具备以下特征:
蒋鹏飞
2020/10/15
7580
百度一面,直接问痛我
这次的百度面试挺紧张的,在写算法题的时候脑子都有点空白,还是按照脑海中那点残存的算法技巧才写出来,不至于太尴尬,以及第一次面试百度这种级别的公司,难免出现了一些平常不至于出现的问题或没注意的缺点,在这里分享给大家。
zz_jesse
2023/09/20
1560
百度一面,直接问痛我
node的事件模块应用(译)
第一次接触Node.js时,就觉得他只不过是用javascript实现的服务端。但实际上他提供了许多浏览器端不具备的方法,比如EventEmitter类。我们在本文中来学习如何使用EventEmitter。
IMWeb前端团队
2019/12/04
4570
百度某部门一面原题(附答案)
这次的百度面试挺紧张的,在写算法题的时候脑子都有点空白,还是按照脑海中那点残存的算法技巧才写出来,不至于太尴尬,以及第一次面试百度这种级别的公司,难免出现了一些平常不至于出现的问题或没注意的缺点,在这里分享给大家。
winty
2023/11/16
2120
百度某部门一面原题(附答案)
javascript中常用的设计模式,教你写出更好的前端代码
今天给大家介绍js中常用的设计模式,也让自己对js设计模式有一个更清晰的认识,下面我们直接进入今日的主题
前端老鸟
2019/07/31
1.1K0
前端面试手写代码
基于一个主题/事件通道,订阅者subscriber通过自定义事件订阅主题,发布者publisher通过发布主题事件的方式发布。
小小杨
2021/10/13
3390
Vue学习-设计模式探索
我们假定,存在一个"信号中心",某个任务执行完成,就向信号中心"发布"(publish)一个信号,其他任务可以向信号中心"订阅"(subscribe)这个信号,从而知道什么时候自己可以开始执行。这就叫做"发布/订阅模式"(publish-subscribe pattern)
Caleb
2020/11/13
6920
Vue学习-设计模式探索
相关推荐
深入理解JS异步编程二(分布式事件)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验