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学习笔记(五) Array 数组类型介绍
Jun 19 Javascript
javascript小数四舍五入多种方法实现
Dec 23 Javascript
jquery设置元素的readonly和disabled的写法
Sep 22 Javascript
JavaScript中对象介绍
Dec 31 Javascript
JS操作COOKIE实现备忘记录的方法
Apr 01 Javascript
深入理解Angularjs向指令传递数据双向绑定机制
Dec 31 Javascript
gulp构建小程序的方法步骤
May 31 Javascript
利用百度echarts实现图表功能简单入门示例【附源码下载】
Jun 10 Javascript
JS实现继承的几种常用方式示例
Jun 22 Javascript
微信小程序制作扭蛋机代码实例
Sep 24 Javascript
p5.js临摹动态图形实现方法详解
Oct 23 Javascript
JavaScript原型链详解
Nov 07 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
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
php生成curl命令行的方法
2015/12/14 PHP
AppBaseJs 类库 网上常用的javascript函数及其他js类库写的
2010/03/04 Javascript
js null,undefined,字符串小结
2010/08/21 Javascript
修改jquery里的dialog对话框插件为框架页(iframe) 的方法
2010/09/14 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
JS简单实现元素复制示例附图
2013/11/19 Javascript
JavaScript通过join函数连接数组里所有元素的方法
2015/03/20 Javascript
基于JavaScript实现瀑布流布局(二)
2016/01/26 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
jQuery分页插件jquery.pagination.js使用方法解析
2017/02/09 Javascript
js中document.referrer实现移动端返回上一页
2017/02/22 Javascript
jQuery实现 RadioButton做必选校验功能
2017/06/15 jQuery
js 概率计算(简单版)
2017/09/12 Javascript
原生JS实现网页手机音乐播放器 歌词同步播放的示例
2018/02/02 Javascript
通过实例了解JS执行上下文运行原理
2020/06/17 Javascript
基于Python实现的百度贴吧网络爬虫实例
2015/04/17 Python
Python中元组,列表,字典的区别
2017/05/21 Python
详解python eval函数的妙用
2017/11/16 Python
对python 矩阵转置transpose的实例讲解
2018/04/17 Python
python的pytest框架之命令行参数详解(上)
2019/06/27 Python
Python面向对象编程基础实例分析
2020/01/17 Python
简单了解pytest测试框架setup和tearDown
2020/04/14 Python
matplotlib基础绘图命令之errorbar的使用
2020/08/13 Python
德国柯吉澳趣味家居:Koziol
2017/08/24 全球购物
ASOS比利时:英国线上零售商及自有品牌
2018/07/29 全球购物
应届毕业生的个人自我鉴定
2013/10/24 职场文书
关于赌博的检讨书
2014/01/24 职场文书
信息技术教学反思
2014/02/12 职场文书
关于祖国的演讲稿
2014/05/04 职场文书
新生开学寄语大全
2015/05/28 职场文书
在校证明模板
2015/06/17 职场文书
React 高阶组件HOC用法归纳
2021/06/13 Javascript
oracle数据库去除重复数据
2022/05/20 Oracle
SQL使用复合索引实现数据库查询的优化
2022/05/25 SQL Server
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers