• 深入理解JS异步编程二(分布式事件)


    PubSub模式

    从原生的js角度,我们要监听某事件的方法就是利用addEventListener方法,但是当我们的页面趋于复杂,比如要向某个元素添加多个处理事件,那么就要用一个封装函数汇集多个处理函数

    link.onclick = function() {
        clickHandler1.apply(this, arguments);
        clickHandler2.apply(this, arguments);
    };

    在jquery中,jquery.on()方法使用的比较多,在新版的jquery中,也舍弃了bind()方法,统一使用on,jQuery 将link 元素的事件发布给了任何想订阅此事件的人。

    Node.js中的EventEmitter 对象
    要想给EventEmitter 对象添加一个事件处理器,只要以事件类型和事件处理器为参数调用on 方法即可。

    emitter.on('evacuate', function(message) {
        console.log(message);
    });

    emit(意为“触发”)方法负责调用给定事件类型的所有处理器。举个例子,下面这行代码:

    emitter.emit('evacuate');

    将调用evacuate 事件的所有处理器。

    请注意,这里的术语事件跟事件队列没有任何关系。

    使用emit 方法触发事件时,可以添加任意多的附加参数。所有参数均传递至所有处理器。

    emitter.emit('evacuate', 'Woman and children first!');

    实现一个PubSub模式

    一个PubSub模型主要方法有3个,订阅,退订,发布

    var PubSub = {};
    // 用于储存事件队列
    var queue = {};
    
    // 订阅接口
    PubSub.on = function(event, cb) {
      if (!queue[event]) {
        queue[event] = [];
      }
      queue[event].push(cb);
    };
    
    // 退订接口
    PubSub.off = function(event, cb) {
      var currentEvent = queue[event];
      var len = 0;
      if (currentEvent) {
        len = currentEvent.length;
        for (var i = len - 1; i >= 0; i--) {
          if (currentEvent[i] === cb) {
            currentEvent.splice(i, 1);
          }
        }
      }
    };
    
    // 发布接口
    PubSub.emit = function(event) {
      var currentEvent = queue[event];
      if (currentEvent) {
        for (var i = 0; i < currentEvent.length; i++) {
          currentEvent[i]();
        }
      }
    };
    
    
    //使用
    // 订阅
    var callbackA = function () {
        console.log('event a happened')
    };
    PubSub.on('a', callbackA);
    PubSub.on('b', function() {
        console.log('event b happened')
    });
    
    // 退订 , 第二个参赛传入回调函数的引用
    PubSub.off('a', callbackA);
    
    // 发布
    PubSub.emit('a');
    PubSub.emit('b'); 
  • 相关阅读:
    解决Laravel 开启HTTPS反向代理时Url一直是Http问题
    Laravel Passport 401 Unauthenticated.
    Windows 10 1909 (2020年1月) DVD (Chinese-Simplified)
    Office Professional Plus 2019 下载安装激活
    电脑设置U盘启动快捷键
    适用于 Laravel 的阿里云MNS队列驱动
    idea 2021版下创建springMvc项目过程
    UML类图关系(泛化 、继承、实现、依赖、关联、聚合、组合)
    Mac 下打包python 程序
    Tomcat 对 servlet 的支持表
  • 原文地址:https://www.cnblogs.com/wkyseo/p/5880889.html
Copyright © 2020-2023  润新知