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将从数据库中读取出来的日期型格式化为想要的类型。
Aug 15 Javascript
理解JavaScript中的对象 推荐
Jan 09 Javascript
actionscript与javascript的区别
May 25 Javascript
判断日期是否能跨月查询的js代码
Jul 25 Javascript
js实现ctrl+v粘贴上传图片(兼容chrome、firefox、ie11)
Mar 09 Javascript
jquery分页插件jquery.pagination.js使用方法解析
Apr 01 Javascript
javascript中使用未定义变量或值的情况分析
Jul 19 Javascript
基于LayUI实现前端分页功能的方法
Jul 22 Javascript
Vue使用vue-area-linkage实现地址三级联动效果的示例
Jun 27 Javascript
vue.js input框之间赋值方法
Aug 24 Javascript
Vue学习之组件用法实例详解
Jan 06 Javascript
在vue中使用eslint,配合vscode的操作
Nov 09 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上传文件时文件过大$_FILES为空的解决方法
2013/11/26 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
PHP实现广度优先搜索算法(BFS,Broad First Search)详解
2017/09/16 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
Tips 带三角可关闭的文字提示
2010/10/06 Javascript
遨游,飞飞,IE,空中网 浏览器无提示关闭方法
2011/07/11 Javascript
js控制CSS样式属性语法对照表
2012/12/11 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
node.js中的http.response.setHeader方法使用说明
2014/12/14 Javascript
jQuery使用drag效果实现自由拖拽div
2015/06/11 Javascript
JavaScript中全选、全不选、反选、无刷新删除、批量删除、即点即改入库(在yii框架中操作)的代码分享
2016/11/01 Javascript
JavaScript实现事件的中断传播和行为阻止方法示例
2017/01/20 Javascript
Javascript(es2016) import和require用法和区别详解
2017/08/11 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
2017/08/17 jQuery
vue.js实现点击后动态添加class及删除同级class的实现代码
2018/04/04 Javascript
详解使用VUE搭建后台管理系统(vue-cli更新至3.0)
2018/08/22 Javascript
Vue.js组件间通信方式总结【推荐】
2018/11/23 Javascript
如何用RxJS实现Redux Form
2018/12/29 Javascript
layui table 获取分页 limit的方法
2019/09/20 Javascript
[02:36]DOTA2亚洲邀请赛小组赛精彩集锦:EE凭借法力虚空拿下4杀
2017/03/30 DOTA
[01:20]2018DOTA2亚洲邀请赛总决赛战队LGD晋级之路
2018/04/07 DOTA
详解Django中的过滤器
2015/07/16 Python
通过实例解析Python调用json模块
2019/12/11 Python
PyTorch 解决Dataset和Dataloader遇到的问题
2020/01/08 Python
wxpython自定义下拉列表框过程图解
2020/02/14 Python
传统HTML页面实现模块化加载的方法
2018/10/15 HTML / CSS
Silk Therapeutics官网:清洁、抗衰老护肤品
2020/08/12 全球购物
丝芙兰墨西哥官网:Sephora墨西哥
2020/05/30 全球购物
师范生的个人求职信范文
2014/01/04 职场文书
优秀大学生求职自荐信范文
2014/04/19 职场文书
大学生逃课检讨书
2015/05/04 职场文书
幼儿园小班教学反思
2016/03/03 职场文书
html实现随机点名器的示例代码
2021/04/02 Javascript
Python使用OpenCV和K-Means聚类对毕业照进行图像分割
2021/06/11 Python
MySQL数据库如何查看表占用空间大小
2022/06/10 MySQL
Win10本地连接不见了怎么恢复? win10系统电脑本地连接不见了解决方法
2023/01/09 数码科技