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 相关文章推荐
列表内容的选择
Jun 30 Javascript
禁止刷新,回退的JS
Nov 25 Javascript
jquery Mobile入门—多页面切换示例学习
Jan 08 Javascript
js导入导出excel(实例代码)
Nov 25 Javascript
javascript闭包的理解
Apr 01 Javascript
javascript消除window.close()的提示窗口
May 20 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
Nov 01 Javascript
JS限制条件补全问题实例分析
Dec 16 Javascript
JS和jQuery通过this获取html标签中的属性值(实例代码)
Sep 11 jQuery
vue vuex vue-rouert后台项目——权限路由(适合初学)
Dec 29 Javascript
利用js实现简易红绿灯
Oct 15 Javascript
如何使用CocosCreator对象池
Apr 14 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函数memory_get_usage获取PHP内存清耗量的方法
2011/12/06 PHP
php 目录遍历、删除 函数的使用介绍
2013/04/28 PHP
基于php导出到Excel或CSV的详解(附utf8、gbk 编码转换)
2013/06/25 PHP
php中用socket模拟http中post或者get提交数据的示例代码
2013/08/08 PHP
php 解压rar文件及zip文件的方法
2014/05/05 PHP
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
大家在抢红包,程序员在研究红包算法
2015/08/31 PHP
PHP生成和获取XML格式数据的方法
2016/03/04 PHP
脚本吧 - 幻宇工作室用到js,超强推荐expand.js
2006/12/23 Javascript
JavaScript Event学习第七章 事件属性
2010/02/07 Javascript
jquery遍历checkbox的注意事项说明
2014/02/21 Javascript
【经典源码收藏】基于jQuery的项目常见函数封装集合
2016/06/07 Javascript
Bootstrap中的Panel和Table全面解析
2016/06/13 Javascript
javascript运算符语法全面概述
2016/07/14 Javascript
开源免费天气预报接口API及全国所有地区代码(国家气象局提供)
2016/12/26 Javascript
angular仿支付宝密码框输入效果
2017/03/25 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
2017/09/20 jQuery
vue+axios 前端实现登录拦截的两种方式(路由拦截、http拦截)
2018/10/24 Javascript
深入浅析javascript函数中with
2018/10/28 Javascript
微信小程序使用map组件实现获取定位城市天气或者指定城市天气数据功能
2019/01/22 Javascript
python黑魔法之参数传递
2016/02/12 Python
Python正则抓取新闻标题和链接的方法示例
2017/04/24 Python
python抓取文件夹的所有文件
2018/02/27 Python
python提取包含关键字的整行数据方法
2018/12/11 Python
python分布式编程实现过程解析
2019/11/08 Python
PyQt5中多线程模块QThread使用方法的实现
2020/01/31 Python
Python 打印自己设计的字体的实例讲解
2021/01/04 Python
老生常谈CSS中的长度单位
2016/06/27 HTML / CSS
webView加载html图片遇到的问题解决
2019/10/08 HTML / CSS
June Jacobs尊积帕官网:知名的spa水疗护肤品牌
2019/03/21 全球购物
亚洲航空公司官方网站:AirAsia
2019/11/25 全球购物
软件配置管理有什么好处
2015/04/15 面试题
两年的个人工作自我评价
2014/01/10 职场文书
庆元旦演讲稿
2014/09/15 职场文书
卖房授权委托书样本
2014/10/05 职场文书
Python turtle编写简单的球类小游戏
2022/03/31 Python