• js EventBus


    Es6

    class EventBus {
      constructor() {
        this._events = [];//存储自定义事件
      }
    
      /**
       * 注册事件和处理函数
       * @param event
       * @param fn
       */
      on(event, fn) {
        if (Array.isArray(event)) {
          for (let i = 0, l = event.length; i < l; i++) {
            this.on(event[i], fn)
          }
        } else {
          // 存在直接push, 不存在创建为空数组再push
          (this._events[event] || (this._events[event] = [])).push(fn)
        }
      }
    
      /**
       * 注册事件和处理函数,触发一次后销毁
       * @param event
       * @param fn
       */
      once(event, fn) {
        let _self=this;
        function handler() {
          _self.off(event, handler);
          fn.apply(null,arguments);//emit里面调用时会给on方法传参
        }
    
        handler.fn = fn;//off里面根据这个判断销毁事件
        this.on(event, handler);
      }
    
      /**
       * 销毁事件和处理函数
       * @param event
       * @param fn
       */
      off(event, fn) {
        //不传参数表示清空所有
        if (!arguments.length) {
          this._events = [];
        }
        //数组循环清空
        if (Array.isArray(event)) {
          for (let i = 0, l = event.length; i < l; i++) {
            this.off(event[i], fn)
          }
        }
        const cbs = this._events[event];
        if (!cbs) {
          return;
        }
        //不传第二参表示清空某事件所有监听函数
        if (arguments.length == 1) {
          this._events[event] = null
        }
        let cb, i = cbs.length
        while (i--) {
          cb = cbs[i]
          if (cb === fn || cb.fn === fn) { //cb.fn===fn用来移除once注册的事件
            cbs.splice(i, 1)
            break
          }
        }
      }
    
      /**
       * 触发某事件所有回调并带参数
       * @param event
       */
      emit(event) {
        //once删除事件会导致下面循环过程中this._events内fn前移, 所以此处复制成新数组
        let cbs = [...this._events[event]];
        if (cbs) {
          for (let i = 0, l = cbs.length; i < l; i++) {
            try {
              cbs[i].apply(null,[...arguments].slice(1))
            } catch (e) {
              new Error(e, `event handler for "${event}"`)
            }
          }
        }
      }
    }
    
    //测试用例
    let eb=new EventBus();
    eb.once('event1',params=>console.log(11,params));
    eb.on('event1',params=>console.log(22,params));
    eb.emit('event1',33)

    Es5

    'use strict';
    
    var _createClass = function () {
      function defineProperties(target, props) {
        for (var i = 0; i < props.length; i++) {
          var descriptor = props[i];
          descriptor.enumerable = descriptor.enumerable || false;
          descriptor.configurable = true;
          if ("value" in descriptor) descriptor.writable = true;
          Object.defineProperty(target, descriptor.key, descriptor);
        }
      }
    
      return function (Constructor, protoProps, staticProps) {
        if (protoProps) defineProperties(Constructor.prototype, protoProps);
        if (staticProps) defineProperties(Constructor, staticProps);
        return Constructor;
      };
    }();
    
    function _toConsumableArray(arr) {
      if (Array.isArray(arr)) {
        for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {
          arr2[i] = arr[i];
        }
        return arr2;
      } else {
        return Array.from(arr);
      }
    }
    
    function _classCallCheck(instance, Constructor) {
      if (!(instance instanceof Constructor)) {
        throw new TypeError("Cannot call a class as a function");
      }
    }
    
    var EventBus = function () {
      function EventBus() {
        _classCallCheck(this, EventBus);
    
        this._events = []; //存储自定义事件
      }
    
      /**
       * 注册事件和处理函数
       * @param event
       * @param fn
       */
    
    
      _createClass(EventBus, [{
        key: 'on',
        value: function on(event, fn) {
          if (Array.isArray(event)) {
            for (var i = 0, l = event.length; i < l; i++) {
              this.on(event[i], fn);
            }
          } else {
            // 存在直接push, 不存在创建为空数组再push
            (this._events[event] || (this._events[event] = [])).push(fn);
          }
        }
    
        /**
         * 注册事件和处理函数,触发一次后销毁
         * @param event
         * @param fn
         */
    
      }, {
        key: 'once',
        value: function once(event, fn) {
          var _self = this;
    
          function handler() {
            _self.off(event, handler);
            fn.apply(null, arguments); //emit里面调用时会给on方法传参
          }
    
          handler.fn = fn; //off里面根据这个判断销毁事件
          this.on(event, handler);
        }
    
        /**
         * 销毁事件和处理函数
         * @param event
         * @param fn
         */
    
      }, {
        key: 'off',
        value: function off(event, fn) {
          //不传参数表示清空所有
          if (!arguments.length) {
            this._events = [];
          }
          //数组循环清空
          if (Array.isArray(event)) {
            for (var _i = 0, l = event.length; _i < l; _i++) {
              this.off(event[_i], fn);
            }
          }
          var cbs = this._events[event];
          if (!cbs) {
            return;
          }
          //不传第二参表示清空某事件所有监听函数
          if (arguments.length == 1) {
            this._events[event] = null;
          }
          var cb = void 0,
            i = cbs.length;
          while (i--) {
            cb = cbs[i];
            if (cb === fn || cb.fn === fn) {
              //cb.fn===fn用来移除once注册的事件
              cbs.splice(i, 1);
              break;
            }
          }
        }
    
        /**
         * 触发某事件所有回调并带参数
         * @param event
         */
    
      }, {
        key: 'emit',
        value: function emit(event) {
          //once删除事件会导致下面循环过程中this._events内fn前移, 所以此处复制成新数组
          var cbs = [].concat(_toConsumableArray(this._events[event]));
          if (cbs) {
            for (var i = 0, l = cbs.length; i < l; i++) {
              try {
                cbs[i].apply(null, [].concat(Array.prototype.slice.call(arguments)).slice(1));
              } catch (e) {
                new Error(e, 'event handler for "' + event + '"');
              }
            }
          }
        }
      }]);
    
      return EventBus;
    }();
    
    
    //测试用例
    var eb = new EventBus();
    eb.once('event1', function (params) {
      return console.log(11, params);
    });
    eb.on('event1', function (params) {
      return console.log(22, params);
    });
    eb.emit('event1', 33);

    本文地址:

    https://www.cnblogs.com/stumpx/p/15136761.html

    ==

  • 相关阅读:
    利用js读出xml制作地区联动下拉框
    用EXTJS做一个右下角的泡泡窗口(一)
    用Json.net 解析 QQ城市达人中的地址列表
    用httpwebrequest访问跨域网站时对CookieContainer的处理
    asp.net 中PDF模式下省略水晶报表自己的预览
    asp.net 取得URL信息
    利用WebClient 制作调试Http的post 和 get 工具
    超级网银就是一砣 SHI
    SAP R/3 Testing[2]
    [1.1]用WebService返回歌曲的曲目信息.借鉴[星集工作室 张麟 Dephi版]
  • 原文地址:https://www.cnblogs.com/stumpx/p/15136761.html
Copyright © 2020-2023  润新知