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 面向对象 对象(Object)
May 13 Javascript
js 数据类型转换总结笔记
Jan 17 Javascript
如何使用jQuery Draggable和Droppable实现拖拽功能
Jul 05 Javascript
深入理解JavaScript单体内置对象
Jun 06 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
Jan 23 Javascript
原生js实现轮播图的示例代码
Feb 20 Javascript
基于EasyUI的基础之上实现树形功能菜单
Jun 28 Javascript
详解webpack性能优化——DLL
Oct 20 Javascript
jQuery实现模拟搜索引擎的智能提示功能简单示例
Jan 27 jQuery
JavaScript 判断iPhone X Series机型的方法
Jan 28 Javascript
js array数组对象操作方法汇总
Mar 18 Javascript
详解vuex数据传输的两种方式及this.$store undefined的解决办法
Aug 26 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基础知识:函数基础知识
2006/12/13 PHP
PHP 5.6.11中CURL模块问题的解决方法
2016/08/08 PHP
PHP实现深度优先搜索算法(DFS,Depth First Search)详解
2017/09/16 PHP
php弹出提示框的是实例写法
2019/09/26 PHP
浅谈Laravel中的三种中间件的作用
2019/10/13 PHP
PHP中的异常处理机制深入讲解
2020/11/10 PHP
JS Timing
2007/04/21 Javascript
javascript 日期常用的方法
2009/11/11 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
2012/01/15 Javascript
jquery插件validate验证的小例子
2013/05/08 Javascript
第五篇Bootstrap 排版
2016/06/21 Javascript
JS控制静态页面之间传递参数获取参数并应用的简单实例
2016/08/10 Javascript
JavaScript正则表达式exec/g实现多次循环用法示例
2017/01/17 Javascript
如何给ss bash 写一个 WEB 端查看流量的页面
2017/03/23 Javascript
Vue.js学习笔记之修饰符详解
2017/07/25 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
浅谈layui分页控件field参数接收对象的问题
2019/09/20 Javascript
在Vue中获取自定义属性方法:data-id的实例
2020/09/09 Javascript
实现vuex原理的示例
2020/10/21 Javascript
nuxt 自定义 auth 中间件实现令牌的持久化操作
2020/11/05 Javascript
[01:56]《DOTA2》中文配音CG
2013/04/22 DOTA
python Qt5实现窗体跟踪鼠标移动
2019/12/13 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
Django数据库操作之save与update的使用
2020/04/01 Python
html5 sessionStorage会话存储_动力节点Java学院整理
2017/07/06 HTML / CSS
美国性感内衣店:Yandy
2018/06/12 全球购物
C语言中一个结构不能包含指向自己的指针吗
2012/05/25 面试题
C# Debug和Testing相关面试题
2015/10/25 面试题
校园广播稿500字
2014/02/04 职场文书
顶撞老师检讨书
2014/02/07 职场文书
创建市级文明单位实施方案
2014/03/01 职场文书
交通事故协议书
2014/04/15 职场文书
校园标语大全
2014/06/19 职场文书
2014年民主评议党员工作总结
2014/12/02 职场文书
公积金具结保证书
2015/05/11 职场文书
详解Go与PHP的语法对比
2021/05/29 PHP