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 相关文章推荐
将函数的实际参数转换成数组的方法
Jan 25 Javascript
调试Node.JS的辅助工具(NodeWatcher)
Jan 04 Javascript
jQuery中关于ScrollableGridPlugin.js(固定表头)插件的使用逐步解析
Jul 17 Javascript
JavaScript取得WEB安全颜色列表的方法
Jul 14 Javascript
JavaScript省市区三级联动菜单效果
Sep 21 Javascript
JS基于面向对象实现的多个倒计时器功能示例
Feb 28 Javascript
vue使用Axios做ajax请求详解
Jun 07 Javascript
jQuery-ui插件sortable实现自由拖动排序
Dec 01 jQuery
微信小程序实现简单跑马灯效果
May 26 Javascript
JavaScript原型式继承实现方法
Nov 06 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
Jan 03 Javascript
vue data对象重新赋值无效(未更改)的解决方式
Jul 24 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/04/18 PHP
Yii 2.0在Grid中格式化时间方法示例
2017/06/06 PHP
layui框架实现文件上传及TP3.2.3(thinkPHP)对上传文件进行后台处理操作示例
2018/05/12 PHP
php use和include区别总结
2019/10/13 PHP
js脚本学习 比较实用的基础
2006/09/07 Javascript
FLASH 广告之外的链接
2008/12/16 Javascript
使用jQuery.Validate进行客户端验证(初级篇) 不使用微软验证控件的理由
2010/06/28 Javascript
导航跟随滚动条置顶移动示例代码
2013/09/11 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
jQuery实现首页顶部可伸缩广告特效代码
2015/04/15 Javascript
jQuery中的select操作详解
2016/11/29 Javascript
Angular4.0中引入laydate.js日期插件的方法教程
2017/12/25 Javascript
怎样使你的 JavaScript 代码简单易读(推荐)
2019/04/16 Javascript
vue以组件或者插件的形式实现throttle或者debounce
2019/05/22 Javascript
用JavaScript实现贪吃蛇游戏
2020/10/23 Javascript
Python类的多重继承问题深入分析
2014/11/09 Python
python3 小数位的四舍五入(用两种方法解决round 遇5不进)
2019/04/11 Python
python2与python3爬虫中get与post对比解析
2019/09/18 Python
Python 字符串处理特殊空格\xc2\xa0\t\n Non-breaking space
2020/02/23 Python
python3中的logging记录日志实现过程及封装成类的操作
2020/05/12 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
Python并发爬虫常用实现方法解析
2020/11/19 Python
html5基础标签(html5视频标签 html5新标签用法)
2013/12/30 HTML / CSS
欧洲第一中国智能手机和平板电脑网上商店:CECT-SHOP
2018/01/08 全球购物
英国乡村时尚和宠物用品专家:Pet & Country
2018/07/02 全球购物
全球500多个机场的接送服务:Suntransfers
2019/06/03 全球购物
Delphi软件工程师试题
2013/01/29 面试题
中文师范生自荐信
2014/01/30 职场文书
《跨越百年的美丽》教学反思
2014/02/11 职场文书
运动会通讯稿500字
2014/02/20 职场文书
认购协议书范本
2014/04/22 职场文书
村级环境卫生整治方案
2014/05/04 职场文书
毕业生学校推荐信范文
2014/05/21 职场文书
2015年机关纠风工作总结
2015/05/15 职场文书
第四次工业革命,打工人与机器人的竞争
2022/04/21 数码科技
python热力图实现的完整实例
2022/06/25 Python