js实现的订阅发布者模式简单示例


Posted in Javascript onMarch 14, 2020

本文实例讲述了js实现的订阅发布者模式.分享给大家供大家参考,具体如下:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
  <script>
    var pubsub = (function(){
      var q = {}
        topics = {},
        subUid = -1;
      //发布消息
      q.publish = function(topic, args) {
        //判断有没有当前的话题
        if(!topics[topic]) {return;}
        var subs = topics[topic],//当前话题订阅者数组
          len = subs.length;
        while(len--) {
          subs[len].func(topic, args);
        }
        return this;
      };
      //订阅事件
      //接收两个参数 要订阅的话题,处理程序
      q.subscribe = function(topic, func) {
        //如果当前话题已经有订阅者,获取到订阅者数组
        //一个话题名下的 订阅者事件可以是多个fn1, fn2, fn3
        topics[topic] = topics[topic] ? topics[topic] : [];
        
        //给每个订阅者添加唯一的token
        var token = (++subUid).toString();
        topics[topic].push({
          token : token,
          func : func
        });
        return token;
      };
      //取消订阅
      q.unsubscribe = function(token){
        Object.keys(topics).map( key => {
          topics[key].map((fn, fnIndex) => {
            if(fn.token == token){
              topics[key].splice(fnIndex,1)
            }
          })
        })
      }
      return q;
    })();
    //触发的事件(订阅者的处理程序)
    var logmsg1 = function(topics, data) {
      console.log("logging1:" + topics + ":" + data);
    }
 
    var logmsg2 = function(topic, data) {
      
      console.log("logging2:" + topic + ":" + data,'我是订阅者2');
    }
    //监听指定的消息'msgName'
    var sub1 = pubsub.subscribe('msgName', logmsg1);
    var sub2 = pubsub.subscribe('msgName', logmsg2);
    //pubsub.unsubscribe(sub1)
    //发布消息'msgName'
    pubsub.publish('msgName', 'hello world');
    //发布无人监听的消息'msgName1'
    pubsub.publish('anotherMsgName', 'me too!');
  </script>
</body>
</html>

运行结果:

js实现的订阅发布者模式简单示例

感兴趣的朋友可以使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码运行效果。

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

Javascript 相关文章推荐
jQuery侧边栏随窗口滚动实现方法
Mar 04 Javascript
js使用DOM设置单选按钮、复选框及下拉菜单的方法
Jan 20 Javascript
基于jquery实现简单的手风琴特效
Nov 24 Javascript
深入学习AngularJS中数据的双向绑定机制
Mar 04 Javascript
javascript设计模式之module(模块)模式
Aug 19 Javascript
bootstrap datepicker限定可选时间范围实现方法
Sep 28 Javascript
node操作mysql数据库实例详解
Mar 17 Javascript
详解react-redux插件入门
Apr 19 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
Nov 10 Javascript
自定义javascript验证框架示例【附源码下载】
May 31 Javascript
解决vue页面渲染但dom没渲染的操作
Jul 27 Javascript
基于ant design日期控件使用_仅月份的操作
Oct 27 Javascript
vue插槽slot的简单理解与用法实例分析
Mar 14 #Javascript
es6中new.target的作用和使用场景简单示例分析
Mar 14 #Javascript
JS中类的静态方法,静态变量,实例方法,实例变量区别与用法实例分析
Mar 14 #Javascript
js中forEach,for in,for of循环的用法示例小结
Mar 14 #Javascript
JS原型prototype和__proto__用法实例分析
Mar 14 #Javascript
JS数组的高级使用方法示例小结
Mar 14 #Javascript
vue-resource post数据时碰到Django csrf问题的解决
Mar 13 #Javascript
You might like
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
支持中文的PHP按字符串长度分割成数组代码
2015/05/17 PHP
php 替换文章中的图片路径,下载图片到本地服务器的方法
2018/02/06 PHP
laravel框架模型中非静态方法也能静态调用的原理分析
2019/11/23 PHP
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
AngularJS入门教程(零):引导程序
2014/12/06 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
使用AmplifyJS组件配合JavaScript进行编程的指南
2015/07/28 Javascript
jquery自动补齐功能插件flexselect用法示例
2016/08/06 Javascript
JavaScript每天必学之数组和对象部分
2016/09/17 Javascript
JavaScript 是什么意思
2016/09/22 Javascript
详解Vue 方法与事件处理器
2017/06/20 Javascript
JS简单实现数组去重的方法分析
2017/10/14 Javascript
JS简单获得节点元素的方法示例
2018/02/10 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
[28:57]EG vs VGJ.T 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/16 DOTA
Python 时间操作例子和时间格式化参数小结
2014/04/24 Python
Python极简代码实现杨辉三角示例代码
2016/11/15 Python
Django教程笔记之中间件middleware详解
2018/08/01 Python
python得到windows自启动列表的方法
2018/10/14 Python
浅谈Python反射 &amp; 单例模式
2019/03/21 Python
详解pandas的外部数据导入与常用方法
2019/05/01 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
2020/03/06 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
python产生模拟数据faker库的使用详解
2020/11/04 Python
css3 仿写阿里云水纹效果的示例代码
2018/02/10 HTML / CSS
C和C++经典笔试题附答案解析
2014/08/18 面试题
物流管理专业大学生自荐信
2013/10/04 职场文书
建筑装饰学院室内设计专业个人自我评价
2013/12/07 职场文书
服装区域经理岗位职责
2015/04/10 职场文书
2015年公司后勤管理工作总结
2015/05/13 职场文书
芙蓉镇观后感
2015/06/10 职场文书
使用javascript解析二维码的三种方式
2021/11/11 Javascript
Vue中Object.assign清空数据报错的解决方案
2022/03/03 Vue.js