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 对象的创建与使用
Mar 09 Javascript
Jquery提交表单 Form.js官方插件介绍
Mar 01 Javascript
jQuery学习笔记之 Ajax操作篇(三) - 过程处理
Jun 23 Javascript
javascript正则表达式中的replace方法详解
Apr 20 Javascript
BootStrap 获得轮播中的索引和当前活动的焦点对象
May 11 Javascript
JavaScript制作简单的框选图表
May 15 Javascript
jQuery实现简单的滑动导航代码(移动端)
May 22 jQuery
解决vue 路由变化页面数据不刷新的问题
Mar 13 Javascript
js中call()和apply()改变指针问题的讲解
Jan 17 Javascript
jQuery实现合并表格单元格中相同行操作示例
Jan 28 jQuery
React精髓!一篇全概括小结(急速)
May 23 Javascript
Vue项目如何引入bootstrap、elementUI、echarts
Nov 26 Vue.js
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
解析php二分法查找数组是否包含某一元素
2013/05/23 PHP
php检测网页是否被百度收录的函数代码
2013/10/09 PHP
PHP生成二维码的两个方法和实例
2014/07/01 PHP
Thinkphp3.2.3分页使用实例解析
2016/07/28 PHP
php使用include 和require引入文件的区别
2017/02/16 PHP
php显示页码分页类的封装
2017/06/08 PHP
js下关于onmouseout、事件冒泡的问题经验小结
2010/12/09 Javascript
ASP.NET jQuery 实例18 通过使用jQuery validation插件校验DropDownList
2012/02/03 Javascript
JavaScript快速检测浏览器对CSS3特性的支持情况
2012/09/26 Javascript
Javascript中的关键字和保留字整理
2014/10/16 Javascript
jQuery中noconflict函数的实现原理分解
2015/02/03 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
JS实现的手机端精简幻灯片效果
2016/09/05 Javascript
javascript的函数劫持浅析
2016/09/26 Javascript
慕课网题目之js实现抽奖系统功能
2017/09/19 Javascript
微信小程序实现日历效果
2018/12/28 Javascript
vue实现自定义H5视频播放器的方法步骤
2019/07/01 Javascript
JQuery Ajax如何实现注册检测用户名
2020/09/25 jQuery
[03:07]DOTA2英雄基础教程 冰霜诅咒极寒幽魂
2013/12/06 DOTA
Python使用gRPC传输协议教程
2018/10/16 Python
深入解析python中的实例方法、类方法和静态方法
2019/03/11 Python
python requests使用socks5的例子
2019/07/25 Python
解决使用export_graphviz可视化树报错的问题
2019/08/09 Python
python实现批量处理将图片粘贴到另一张图片上并保存
2019/12/12 Python
关于Python错误重试方法总结
2021/01/03 Python
详解Sticky Footer 绝对底部的两种套路
2017/11/03 HTML / CSS
毕业生物理教师求职信
2013/10/17 职场文书
优秀毕业生推荐信
2013/11/02 职场文书
党委书记岗位职责
2013/11/24 职场文书
历史系自荐信范文
2013/12/24 职场文书
临床护士自荐信
2014/01/31 职场文书
小学三年级学生评语
2014/04/22 职场文书
小学生竞选班长演讲稿
2014/04/24 职场文书
钱学森电影观后感
2015/06/04 职场文书
2016党员学习《反对自由主义》心得体会
2016/01/22 职场文书
Java Spring Boot 正确读取配置文件中的属性的值
2022/04/20 Java/Android