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实现统计复选框选中数量
Nov 24 Javascript
jQuery中;function($,undefined) 前面的分号的用处
Dec 17 Javascript
javascript定义类和类的实现实例详解
Dec 01 Javascript
深入解析JavaScript框架Backbone.js中的事件机制
Feb 14 Javascript
Bootstrap实现圆角、圆形头像和响应式图片
Dec 14 Javascript
原生js实现返回顶部缓冲效果
Jan 18 Javascript
vue2.0实现倒计时的插件(时间戳 刷新 跳转 都不影响)
Mar 30 Javascript
JavaScript实现QQ聊天消息展示和评论提交功能
May 22 Javascript
Node.js爬取豆瓣数据实例分析
Mar 05 Javascript
用p5.js制作烟花特效的示例代码
Mar 21 Javascript
小程序实现列表多个批量倒计时
Jan 29 Javascript
vue轻量级框架无法获取到vue对象解决方法
May 12 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
phpExcel导出大量数据出现内存溢出错误的解决方法
2013/02/28 PHP
IIS6.0中配置php服务全过程解析
2013/08/07 PHP
在Laravel中使用DataTables插件的方法
2018/05/29 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
Git命令之分支详解
2021/03/02 PHP
Jquery 获得服务器控件值的方法小结
2010/05/11 Javascript
jquery在项目中做复选框时遇到的一些问题笔记
2013/11/17 Javascript
JavaScript实现文字跟随鼠标特效
2015/08/06 Javascript
Augularjs-起步详解
2016/07/08 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
用javascript获取任意颜色的更亮或更暗颜色值示例代码
2017/07/21 Javascript
vue.js select下拉框绑定和取值方法
2018/03/03 Javascript
vue-i18n结合Element-ui的配置方法
2019/05/20 Javascript
layui form.render('select', 'test2') 更新渲染的方法
2019/09/27 Javascript
浅谈Webpack4 Tree Shaking 终极优化指南
2019/11/18 Javascript
Vue的el-scrollbar实现自定义滚动
2018/05/29 Python
Python爬取商家联系电话以及各种数据的方法
2018/11/10 Python
python实现H2O中的随机森林算法介绍及其项目实战
2019/08/29 Python
python 比较2张图片的相似度的方法示例
2019/12/18 Python
Python模块_PyLibTiff读取tif文件的实例
2020/01/13 Python
Python @property原理解析和用法实例
2020/02/11 Python
用Python生成HTML表格的方法示例
2020/03/06 Python
基于Python的Jenkins的二次开发操作
2020/05/12 Python
Python代码中如何读取键盘录入的值
2020/05/27 Python
Manjaro、pip、conda更换国内源的方法
2020/11/17 Python
网站编辑求职信
2013/10/17 职场文书
教师评优事迹材料
2014/01/10 职场文书
促销活动策划方案
2014/01/12 职场文书
巾帼建功标兵事迹材料
2014/05/11 职场文书
护理专业毕业生自荐书
2014/05/24 职场文书
拓展策划方案
2014/06/03 职场文书
2014年应急管理工作总结
2014/11/26 职场文书
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
2021/04/22 PostgreSQL
Python 中数组和数字相乘时的注意事项说明
2021/05/10 Python
Mysql数据库命令大全
2021/05/26 MySQL
正则表达式拆分url实例代码
2022/02/24 Java/Android