JavaScript观察者模式(publish/subscribe)原理与实现方法


Posted in Javascript onMarch 30, 2017

本文实例讲述了JavaScript观察者模式(publish/subscribe)原理与实现方法。分享给大家供大家参考,具体如下:

观察者模式又叫做发布订阅模式,它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察着对象。它是由两类对象组成,主题和观察者,主题负责发布事件,同时观察者通过订阅这些事件来观察该主体,发布者和订阅者是完全解耦的,彼此不知道对方的存在,两者仅仅共享一个自定义事件的名称。

在Nodejs中通过EventEmitter实现了原生的对于这一模式的支持。在JavaScript中事件监听机制就可以理解为一种观察者模式。

下面给出一个JS自定义的PubSub,仔细阅读下面这段代码有助于你理解观察者模式。相关代码请查看github。

function PubSub() {
 this.handlers = {};
}
PubSub.prototype = {
  // 订阅事件
  on: function(eventType, handler){
    var self = this;
    if(!(eventType in self.handlers)) {
      self.handlers[eventType] = [];
    }
    self.handlers[eventType].push(handler);
    return this;
  },
   // 触发事件(发布事件)
  emit: function(eventType){
    var self = this;
    var handlerArgs = Array.prototype.slice.call(arguments,1);
    for(var i = 0; i < self.handlers[eventType].length; i++) {
     self.handlers[eventType][i].apply(self,handlerArgs);
    }
    return self;
  },
  // 删除订阅事件
  off: function(eventType, handler){
    var currentEvent = this.handlers[eventType];
    var len = 0;
    if (currentEvent) {
      len = currentEvent.length;
      for (var i = len - 1; i >= 0; i--){
        if (currentEvent[i] === handler){
          currentEvent.splice(i, 1);
        }
      }
    }
    return this;
  }
};
var pubsub = new PubSub();
var callback = function(data){
  console.log(data);
};
//订阅事件A
pubsub.on('A', function(data){
  console.log(1 + data);
});
pubsub.on('A', function(data){
  console.log(2 + data);
});
pubsub.on('A', callback);
//触发事件A
pubsub.emit('A', '我是参数');
//删除事件A的订阅源callback
pubsub.off('A', callback);
pubsub.emit('A', '我是第二次调用的参数');

运行结果。

JavaScript观察者模式(publish/subscribe)原理与实现方法

更多关于JavaScript相关内容可查看本站专题:《javascript面向对象入门教程》、《JavaScript中json操作技巧总结》、《JavaScript切换特效与技巧总结》、《JavaScript查找算法技巧总结》、《JavaScript动画特效与技巧汇总》、《JavaScript错误与调试技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript遍历算法与技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
JavaScript 创建对象和构造类实现代码
Jul 30 Javascript
node.js chat程序如何实现Ajax long-polling长链接刷新模式
Mar 13 Javascript
jquery等宽输出文字插件使用介绍
Sep 18 Javascript
js生成随机数(指定范围)的实例代码
Jul 10 Javascript
SelecT下拉框选中和取值的解决方法
Nov 22 Javascript
使用jQuery实现简单的tab框实例
Aug 22 jQuery
用vue封装插件并发布到npm的方法步骤
Oct 18 Javascript
解决Angular4项目部署到服务器上刷新404的问题
Aug 31 Javascript
微信jssdk逻辑在vue中的运用详解
Nov 14 Javascript
基于JS实现一个随机生成验证码功能
May 29 Javascript
12 种使用Vue 的最佳做法
Mar 30 Javascript
vue Treeselect 树形下拉框:获取选中节点的ids和lables操作
Aug 15 Javascript
Angular.js去除页面中显示的空行方法示例
Mar 30 #Javascript
JavaScript实现父子dom同时绑定两个点击事件,一个用捕获,一个用冒泡时执行顺序的方法
Mar 30 #Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
Mar 30 #Javascript
JavaScript mixin实现多继承的方法详解
Mar 30 #Javascript
Angular.JS中的指令引用template与指令当做属性详解
Mar 30 #Javascript
jQuery源码解读之extend()与工具方法、实例方法详解
Mar 30 #jQuery
jQuery实现Select下拉列表进行状态选择功能
Mar 30 #jQuery
You might like
php miniBB中文乱码问题解决方法
2008/11/25 PHP
PHP中使用gettext来支持多语言的方法
2011/05/02 PHP
php根据身份证号码计算年龄的实例代码
2014/01/18 PHP
php上传图片类及用法示例
2016/05/11 PHP
一个很酷的拖动层的js类,兼容IE及Firefox
2009/06/23 Javascript
JavaScript 自动分号插入(JavaScript synat:auto semicolon insertion)
2009/11/04 Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
2013/08/28 Javascript
js Canvas绘制圆形时钟教程
2017/02/06 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
self.attachevent is not a function的解决方法
2017/04/04 Javascript
angular bootstrap timepicker TypeError提示怎么办
2017/06/13 Javascript
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
vue-cli 引入、配置axios的方法
2018/05/08 Javascript
快速解决bootstrap下拉菜单无法隐藏的问题
2018/08/10 Javascript
layer ui 导入文件之前传入数据的实例
2019/09/23 Javascript
jQuery实现弹出层效果
2019/12/10 jQuery
jQuery实现移动端笔触canvas电子签名
2020/05/21 jQuery
python 判断一个进程是否存在
2009/04/09 Python
Python的Django框架可适配的各种数据库介绍
2015/07/15 Python
Pycharm2017版本设置启动时默认自动打开项目的方法
2018/10/29 Python
浅谈Python 列表字典赋值的陷阱
2019/01/20 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
Python Pandas 如何shuffle(打乱)数据
2019/07/30 Python
python区分不同数据类型的方法
2019/10/14 Python
python 实现Flask中返回图片流给前端展示
2020/01/09 Python
为什么黑客都用python(123个黑客必备的Python工具)
2020/01/31 Python
Python连接Mysql进行增删改查的示例代码
2020/08/03 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
Lombok插件安装(IDEA)及配置jar包使用详解
2020/11/04 Python
宝拉珍选英国官网:Paula’s Choice英国
2019/05/29 全球购物
简单说下OSPF的操作过程
2014/08/13 面试题
经济信息系毕业生自荐信范文
2014/03/15 职场文书
优秀广告词大全
2014/03/19 职场文书
人力资源管理毕业生自荐信
2014/06/26 职场文书
《山中访友》教学反思
2016/02/24 职场文书
详解CSS中的特指度和层叠问题
2021/07/15 HTML / CSS