JS案例:基于发布订阅实现的事件消息中心-MessageCenter

本文介绍了如何实现一个简易版的消息中心,基于发布订阅模式,包括注册事件、触发事件、销毁事件、只执行一次的事件等功能。同时,还提供了异步操作支持和事件数量查询。文章通过JavaScript实现了一个消息中心类,并给出了实例验证。

目录

前言

起步

功能设计

工具函数实现

消息中心类实现

验证功能

写在最后


前言

之前写过一篇文章:JS案例:Observer Pattern(观察者模式)和Publisher-Subscriber Pattern(发布者/订阅者模式)_DieHunter1024的博客-优快云博客发布/订阅模式和观察者模式一样吗?在许多地方我们都能见到基于这二者或者说基于某种设计模式的框架,函数或插件在浏览器中使用addEventListener(type,fn)对dom元素进行事件委托,事件监听用户的异步操作Android中也有一个事件发布/订阅的轻量级框架:EventBus,原理与web相似Socket.io的许多方法也是基于此类模式,监听与触发事件,批量广播等在Node中同样也有一个events事件触发器解决异步操作的同步响应https://hunter1024.blog.youkuaiyun.com/article/details/113770950

其中简单描述了一下JavaScript中发布订阅模式的实现,但是个人觉得其中的方法过于单一,于是想尝试拓展一下,做个简易版的消息中心

起步

参考node中的 events事件触发器 我总结归类出了以下函数

  • on :注册事件
  • emit:触发事件
  • un:事件销毁
  • once:注册事件,执行后即销毁
  • clear:重置事件列表(消息中心)
  • has:判断事件是否被订阅
  • handlerLength:返回某个事件的监听函数数量
  • watch:与on一样,不同点是可以将结果返回至发布者
  • invoke:与emit一样,配合watch使用,当watch中存在异步操作时接收其结果

功能设计

了解了实现的功能,我们把类的接口实现一下,其中events是之前文章中的调度中心,使用一个对象来存取所有绑定的事件

export declare interface Handlers {
    [key: string]: Array<Function>
}
export declare interface IMessageCenter {
    events: Handlers
    _instance?: IMessageCenter
    on: (type: string, handler: Function) => this
    emit: (type: string, data?: any) => this
    un: (type: string, handler?: Function) => this
    once: (type: string, handler: Function) => this
    clear: () => this
    has: (type: string) => boolean
    handlerLength: (type: string) => number
    watch: (
评论 24
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿宇的编程之旅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值