美文网首页
模拟实现Event事件订阅、发布机制

模拟实现Event事件订阅、发布机制

作者: 原来如此scater | 来源:发表于2019-04-10 00:16 被阅读0次

最近在写微信小程序的时候,需要用到全局事件的订阅,小程序自身没有该机制,自己写了一个,放到app.js上面,完成了全局事件机制,代码如下:

/**
 * 全局事件响应机制
 * 使用方法:
 *    1、事件订阅:app.event.on(eventName, this, callback)
 *    2、事件广播:app.event.emit(eventName, params)
 *    3、事件注销:app.event.off() // 注销全部
                app.event.off(eventName) // 注销具体事件
                app.event.off(eventName, callback) // 带有回调函数的注销
 */

class Event {
  on (event, ctx, callback) {
      if (typeof callback != "function") {
          console.error('callback must be a function')
          return
      }
      this._stores = this._stores || {};
      (this._stores[event] = this._stores[event] || []).push({cb: callback, ctx: ctx})
  }
  emit (event) {
      this._stores = this._stores || {}
      let store = this._stores[event], args
      if (store) {
          store = store.slice(0)
          args = [].slice.call(arguments, 1)
          for (var i = 0, len = store.length; i < len; i++) {
              store[i].cb.apply(store[i].ctx, args)
          }
      }
  }
  off (event, callback) {
      this._stores = this._stores || {}
      // all
      if (!arguments.length) {
          this._stores = {}
          return
      }
      // specific event
      var store = this._stores[event]
      if (!store) return
      // remove all handlers
      if (arguments.length === 1) {
          delete this._stores[event]
          return 
      }
      // remove specific handler
      var cb
      for (var i = 0, len = store.length; i < len; i++) {
          cb = store[i].cb
          if (cb === callback) {
              store.splice(i, 1)
              break
          }
      }
      return
  }   
}

module.exports = Event

相关文章

  • 模拟实现Event事件订阅、发布机制

    最近在写微信小程序的时候,需要用到全局事件的订阅,小程序自身没有该机制,自己写了一个,放到app.js上面,完成了...

  • 「JS零碎」自定义事件类event

    目的是为了实现一个事件类event, 包含: 绑定事件, 触发事件, 解绑事件其实是一个发布订阅模式:image ...

  • ethereum中go-event库的使用

    github.com/ethereum/go-ethereum/event包实现了一个事件发布订阅的库,使用接口主...

  • EventBus源码解析

    EventBus是一个Android的事件发布/订阅框架 三个角色 Event:事件,它可以是任意类型,Event...

  • EventBus的原理解析

    前言 EventBus是一种发布-订阅事件总线。它有三大要素:Event:事件、Publisher:发布者,可以在...

  • Android系统架构(一) 事件总线

    事件总线。继承自观察者模式,事件总线也是基于发布订阅的机制来实现事件的发送和接受的。 为何要使用 Android ...

  • EOS 通信机制

    boost signal机制: boost的signal/slots用来实现event事件机制,一个signal可...

  • Guava EventBus实现原理

    开篇 EventBus是Guava的事件处理机制,是设计模式中的观察者模式的优雅实现。对于事件监听和发布订阅模式,...

  • Node.js EventEmitter类源码浅析

    写在最前 本次尝试浅析Node.js中的EventEmitter模块的事件机制,分析在Node.js中实现发布订阅...

  • RxBus基本使用

    用RxJava实现事件总线(Event Bus) 对于RxBus的使用,就和普通的RxJava订阅事件很相似了。先...

网友评论

      本文标题:模拟实现Event事件订阅、发布机制

      本文链接:https://www.haomeiwen.com/subject/ydxgiqtx.html