让前端飞Web前端之路饥人谷技术博客

实现一个简单的EventHub

2019-08-21  本文已影响64人  大春春

前言

谈到EventHub就不得不说到发布订阅这一种设计模式,EventHub正是基于这种设计模式实现出来的一个实例,当前在前端方面,EventHub应用已经十分广泛了,例如Vue中的eventbus、redux也对EventHub有所借鉴(redux是单向数据流,遵循MVC结构,M的数据更新后V紧接着更新界面,而EventHub的数据流是没有方向限制的)

什么是EventHub

前言谈到EventHub是基于发布订阅模式实现的一个实例,那么要搞清楚EventHub就先要搞清楚什么是发布订阅模式。

实现一个简单的EventHub

从上面所说的可以得知,EventHub的实现其实就几个功能,发布(on),订阅(emit),当然还有可能存在取消任务的情况(off),这样就足够实现一个简单的EventHub了,不废话,代码如下:

type Event = (data?: any) => any

class EventHub {
    // cache用于存储事件,存储中心
    cache: { [key: string]: Event[] } = {}

    // 接收事件名和事件,同时将其放入到存储中心
    on = (name: string, fn: Event) => {
        this.cache[name] = this.cache[name] || []
        this.cache[name].push(fn)
    }

    // 被订阅的时候,将存储中心对应事件名的所有事件拿出来执行
    emit = (name: string, data?: any) => {
        if(this.cache[name] === undefined) return
        this.cache[name].forEach(fn => {
            fn(data)
        })
    }

    // 取消事件的时候,将被取消的事件从对应事件名中剔除
    off = (name: string, fn: Event) => {
        if(this.cache[name] === undefined) return
        this.cache[name] = this.cache[name].filter(f => f !== fn)
    }
}

接着我们来看看效果:
订阅成功:


image.png

取消订阅:


image.png
上一篇 下一篇

猜你喜欢

热点阅读