zoukankan      html  css  js  c++  java
  • pub/sub的实际应用总结

    pub/sub即观察者模式,有多重表现形式

    1. Publisher/Subscriber
    2. Observer/Observable
    3. Listener(例如EventListener)
    4. EventBus
    5. EventEmitter

    EventBus这种不只是观察者模式,还包含了中介者模式,bus就是一个中介者,负责在消费者和生产者之间转发消息
    而Observer/Observable则是一种比较纯粹的观察者模式,一个对象要发布消息时候,就可以暴露一个Observable出来,
    一个想要接收消息,找到这个Observalble并且Subscribe它。

    下面总结常用框架自带的pub/sub模式实现

    1. jquery的Pub/Sub实现

    1.1 直接注册事件的方法进行

    例如,在window上注册自定义事件,由于jquery是事件支持命名空间,对pub/sub的支持更加给力。

    $(window).on('topic.eventType',function(event,data){
    
    });
    
    $(window).trigger('topic.eventType',[data]);

    1.2 使用jquery的callbacks函数

    jquery自带的callbacks系列函数,就是一个优质的pub/sub的实现,直接使用即可。

    var topic = $.Callbacks();
    topic.add(function () { ... });
    topic.fire();

    也可以进行简单的封装,使其更加自然:

    var topics = {};
     
    jQuery.Topic = function( id ) {
      var callbacks, method,
        topic = id && topics[ id ];
     
      if ( !topic ) {
        callbacks = jQuery.Callbacks();
        topic = {
          publish: callbacks.fire,
          subscribe: callbacks.add,
          unsubscribe: callbacks.remove
        };
        if ( id ) {
          topics[ id ] = topic;
        }
      }
      return topic;
    };
    
    // Subscribers
    $.Topic( "mailArrived" ).subscribe( fn1 );
    $.Topic( "mailArrived" ).subscribe( fn2 );
    $.Topic( "mailSent" ).subscribe( fn1 );
     
    // Publisher
    $.Topic( "mailArrived" ).publish( "hello world!" );
    $.Topic( "mailSent" ).publish( "woo! mail!" );

    具体可以参考 http://api.jquery.com/jQuery.Callbacks/

    2.vue的Pub/Sub实现

    由于vue实例可以监听和发布事件,其可以充当一个EventBus,就可以直接实现一个pub/sub的应用

    var bus = new Vue();
    bus.$on('evnetType',function(data){
    
    });
    bus.$emit('evnetType',data);

    具体在vue组件中使用时候,要在组件销毁时解绑事件。

    created() {
      this.$bus.$on('evnet1', this.method1);
      this.$bus.$on('evnet2', this.method2);
    },
    // 清除事件监听
    beforeDestroy () {
      this.$bus.$off('evnet1', this.method1);
      this.$bus.$off('evnet2', this.method2);
    }

    当然也可以使用第三方的bus实现,省去解除绑定和使用具名函数的麻烦,例如vue-happy-bus。
    bus模式只是适用于简单的组件通信,复杂的通信还是使用vuex吧

    3.Node.js的Pub/Sub实现

    EventEmitter

    emitter.on(event, listener) //注册一个事件
    
    emitter.once(event, listener) //注册一个一次性的事件,触发后就被抹掉
    
    emitter.removeListener(event, listener) //在时间队列中剔除某一个事件
    
    emitter.removeAllListeners([event]) //删除整个事件队列,或多个事件
    
    emitter.listeners(event) //返回某些事件 
    
    emitter.emit(event, [arg1], [arg2], […]) //触发事件,可传入具体参数

    在需要一些Pub/Sub实现,例如动画的执行时机在一个接口执行完之后,又需要在一个按钮点击之后,只是少量情况,但是又有需求,这种场合就非常合适。用框架自带的实现,省去了引入第三方包的麻烦。

  • 相关阅读:
    JavaScript初学者应注意的七个细节
    KindEditor 编辑器使用方法
    有关 JavaScript 的 10 件让人费解的事情
    能说明你的Javascript技术很烂的五个原因
    分享10个便利的HTML5/CSS3框架
    现在就使用HTML5的十大原因
    你应该知道的Node.js扩展模块——Hashish
    C++ Tip: How To Get Array Length | Dev102.com
    MPI for Python — MPI for Python v1.3 documentation
    http://construct.readthedocs.org/en/latest/basics.html
  • 原文地址:https://www.cnblogs.com/mengff/p/8144463.html
Copyright © 2011-2022 走看看