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 相关文章推荐
javascript实现促销倒计时+fixed固定在底部
Sep 18 Javascript
详解 javascript中offsetleft属性的用法
Nov 11 Javascript
JavaScript中日期函数的相关操作知识
Aug 03 Javascript
清除浏览器缓存的几种方法总结(必看)
Dec 09 Javascript
Angular下H5上传图片的方法(可多张上传)
Jan 09 Javascript
javascript设计模式之模块模式学习笔记
Feb 15 Javascript
layui前段框架日期控件使用方法详解
May 19 Javascript
ReactNative列表ListView的用法
Aug 02 Javascript
三分钟学会用ES7中的Async/Await进行异步编程
Jun 14 Javascript
VueCli3.0中集成MockApi的方法示例
Jul 05 Javascript
JS通过识别id、value值对checkbox设置选中状态
Feb 19 Javascript
如何在Vue.JS中使用图标组件
Aug 04 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
用Flash图形化数据(二)
2006/10/09 PHP
php FLEA中二叉树数组的遍历输出
2012/09/26 PHP
thinkphp3.0输出重复两次的解决方法
2014/12/19 PHP
一些常用的Javascript函数
2006/12/22 Javascript
javascript 限制输入脚本大全
2009/11/03 Javascript
jQuery 选择表格(table)里的行和列及改变简单样式
2012/12/15 Javascript
jquery 单引号和双引号的区别及使用注意
2013/07/31 Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
2013/12/06 Javascript
jquery操作select详解(取值,设置选中)
2014/02/07 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
easyui Droppable组件实现放置特效
2015/08/19 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
2015/10/14 Javascript
详解JavaScript中的构造器Constructor模式
2016/01/14 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
深入理解Node.js 事件循环和回调函数
2016/11/02 Javascript
JavaScript控制输入框中只能输入中文、数字和英文的方法【基于正则实现】
2017/03/03 Javascript
JS数组求和的常用方法实例小结
2019/01/07 Javascript
JavaScript JSON数据处理全集(小结)
2019/08/15 Javascript
python的id()函数解密过程
2012/12/25 Python
Python实现自动登录百度空间的方法
2017/06/10 Python
Python实现图片拼接的代码
2018/07/02 Python
PyQt5实现简易计算器
2020/05/30 Python
详解Python给照片换底色(蓝底换红底)
2019/03/22 Python
Python使用LDAP做用户认证的方法
2019/06/20 Python
django 做 migrate 时 表已存在的处理方法
2019/08/31 Python
在Tensorflow中实现梯度下降法更新参数值
2020/01/23 Python
Win10下安装并使用tensorflow-gpu1.8.0+python3.6全过程分析(显卡MX250+CUDA9.0+cudnn)
2020/02/17 Python
基于Python爬取素材网站音频文件
2020/10/21 Python
python 如何在测试中使用 Mock
2021/03/01 Python
英国领先的鞋类零售商和顶级品牌的官方零售商:Wynsors
2020/02/17 全球购物
自动化专业毕业生自荐信
2013/11/01 职场文书
护士实习生自我鉴定范文
2013/12/10 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
Python绘画好看的星空图
2022/03/17 Python
Python实现科学占卜 让视频自动打码
2022/04/09 Python