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 相关文章推荐
JS JQUERY实现滚动条自动滚到底的方法
Jan 09 Javascript
Jquery ajax 同步阻塞引起的UI线程阻塞问题
Nov 17 Javascript
JS控制伪元素的方法汇总
Apr 06 Javascript
原生JS实现图片轮播切换效果
Dec 15 Javascript
浅析BootStrap中Modal(模态框)使用心得
Dec 24 Javascript
利用Chrome DevTools直接调试Node.js和JavaScript的方法详解(并行)
Feb 16 Javascript
React Native 图片查看组件的方法
Mar 01 Javascript
gulp构建小程序的方法步骤
May 31 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
Jun 10 Javascript
Vue中rem与postcss-pxtorem的应用详解
Nov 20 Javascript
Angular 多模块项目构建过程
Feb 13 Javascript
javascript设计模式 ? 桥接模式原理与应用实例分析
Apr 13 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
如何过滤高亮显示非法字符
2006/10/09 PHP
常见php数据文件缓存类汇总
2014/12/05 PHP
php+ajax实现异步上传文件或图片功能
2017/07/18 PHP
PHP实现唤起微信支付功能
2019/02/18 PHP
javascript js cookie的存储,获取和删除
2007/12/29 Javascript
JavaScript 空位补零实现代码
2010/02/26 Javascript
用JQUERY增删元素的代码
2012/02/14 Javascript
js 实现菜单左右滚动显示示例介绍
2013/11/21 Javascript
JavaScript函数的4种调用方法详解
2014/04/22 Javascript
js for循环倒序输出数组元素的实例
2017/03/01 Javascript
javascript遍历json对象的key和任意js对象属性实例
2017/03/09 Javascript
jq源码解析之绑在$,jQuery上面的方法(实例讲解)
2017/10/13 jQuery
es6函数name属性功能与用法实例分析
2020/04/18 Javascript
Python解析xml中dom元素的方法
2015/03/12 Python
Python中使用插入排序算法的简单分析与代码示例
2016/05/04 Python
Python实现统计给定列表中指定数字出现次数的方法
2018/04/11 Python
Python使用pyautogui模块实现自动化鼠标和键盘操作示例
2018/09/04 Python
对python产生随机的二维数组实例详解
2018/12/13 Python
在python 中split()使用多符号分割的例子
2019/07/15 Python
一行python实现树形结构的方法
2019/08/09 Python
浅谈python中统计计数的几种方法和Counter详解
2019/11/07 Python
tornado+celery的简单使用详解
2019/12/21 Python
python 最简单的实现适配器设计模式的示例
2020/06/30 Python
python爬虫scrapy框架之增量式爬虫的示例代码
2021/02/26 Python
Python 实现劳拉游戏的实例代码(四连环、重力四子棋)
2021/03/03 Python
自定义html标记替换html5新增元素
2008/10/17 HTML / CSS
SHEIN香港:价格实惠的女性时尚服装
2018/08/14 全球购物
光声世纪笔试题目
2012/08/25 面试题
机械工程系毕业生求职信
2013/09/27 职场文书
酒店管理专业毕业生推荐信
2013/11/10 职场文书
专项法律服务方案
2014/06/11 职场文书
学校爱国卫生月活动总结
2014/06/25 职场文书
2014年女职工工作总结
2014/11/27 职场文书
2015迎新晚会开场白
2015/05/29 职场文书
2016年“七一建党节”广播稿
2015/12/18 职场文书
如何利用map实现Nginx允许多个域名跨域
2021/03/31 Servers