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的函数重名看其初始化方式
Mar 08 Javascript
jQuery 快速结束当前正在执行的动画
Nov 20 Javascript
JavaScript获取伪元素(Pseudo-Element)属性的方法技巧
Mar 13 Javascript
关于Bootstrap弹出框无法调用问题的解决办法
Mar 10 Javascript
JS动态计算移动端rem的解决方案
Oct 14 Javascript
原生js编写焦点图效果
Dec 08 Javascript
Angular获取手机验证码实现移动端登录注册功能
May 17 Javascript
JavaScript实现一个带AI的井字棋游戏源码
May 21 Javascript
Vue作用域插槽slot-scope实例代码
Sep 05 Javascript
用npm安装vue和vue-cli,并使用webpack创建项目的方法
Sep 28 Javascript
详解Vue项目在其他电脑npm run dev运行报错的解决方法
Oct 29 Javascript
vue 使用rules对表单字段进行校验的步骤
Dec 25 Vue.js
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 ImageMagick windows下安装教程
2015/01/26 PHP
php图像验证码生成代码
2017/06/08 PHP
微信公众平台开发教程②微信端分享功能图文详解
2019/04/10 PHP
ThinkPHP框架实现的微信支付接口开发完整示例
2019/04/10 PHP
JavaScript在多浏览器下for循环的使用方法
2012/11/07 Javascript
模拟用户点击弹出新页面不会被浏览器拦截
2014/04/08 Javascript
Jquery插件实现点击获取验证码后60秒内禁止重新获取
2015/03/13 Javascript
JQuery中DOM事件绑定用法详解
2015/06/13 Javascript
常用的Javascript数据验证插件
2015/08/04 Javascript
javascript实现连续赋值
2015/08/10 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
轻松学习jQuery插件EasyUI EasyUI表单验证
2015/12/01 Javascript
jQuery中值得注意的trigger方法浅析
2016/12/12 Javascript
JS中利用swiper实现3d翻转幻灯片实例代码
2017/08/25 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
jQuery分组选择器简单用法示例
2019/04/04 jQuery
vue路由守卫,限制前端页面访问权限的例子
2019/11/11 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
vue props 一次传多个值实例
2020/07/22 Javascript
[04:09]显微镜下的DOTA2第十二期—NaVi美如画的团战
2014/06/23 DOTA
Pyramid Mako模板引入helper对象的步骤方法
2013/11/27 Python
图文讲解选择排序算法的原理及在Python中的实现
2016/05/04 Python
pandas DataFrame 删除重复的行的实现方法
2019/01/29 Python
Python实现爬取马云的微博功能示例
2019/02/16 Python
浅谈对pytroch中torch.autograd.backward的思考
2019/12/27 Python
HTML5的表单(绝对特别强大的功能)使用示例
2013/06/20 HTML / CSS
HTML5给汉字加拼音收起展开组件的实现代码
2020/04/08 HTML / CSS
海蓝之谜英国官网:La Mer英国
2020/01/15 全球购物
澳大利亚女装精品店:Alannah Hill
2020/07/29 全球购物
员工入职担保书范文
2014/04/01 职场文书
2014年客服工作总结范文
2014/11/13 职场文书
拾金不昧感谢信范文
2015/01/21 职场文书
2015年党员公开承诺书范文
2015/01/22 职场文书
2015学习委员工作总结范文
2015/04/03 职场文书
Java多条件判断场景中规则执行器的设计
2021/06/26 Java/Android
python+pyhyper实现识别图片中的车牌号思路详解
2022/12/24 Python