【SSD系列】傻傻的,3行代码一个订阅发布中心,不会不知道吧

简介: 无处不在的订阅发布模式,也是常备手写系列,可见其地位。其实,在浏览器端,3行代码,没错3行代码,你就可以拥有一个具备订阅,取消订阅,发布,并具备once能力的订阅发布中心。

1.JPG


关于[SSD系列]


专门为8月征文活动而建立的系列,收集整理前端一些有意思或者我们不重视的内容,可能是部分掘友不知道的。


前言


无处不在的订阅发布模式,也是常备手写系列,可见其地位。


其实,在浏览器端,3行代码,没错3行代码,你就可以拥有一个具备订阅,取消订阅,发布,并具备once能力的订阅发布中心。


4行代码的订阅发布中心


订阅发布中心代码


window._on = window.addEventListener;
window._off = window.removeEventListener;
window._emit = (type, data) => window.dispatchEvent(new CustomEvent(type, { detail: data }));;
window._once = (type, callback) => window.addEventListener(type, callback, { once: true, capture: true });
复制代码


标题是3行也是可以的,把1,2行合并一下:


(window._on = window.addEventListener, window._off = window.removeEventListener);
复制代码


测试代码


function onEventX(ev) {
    console.log("event-x 收到数据:", ev.detail);
}
// 订阅
window._on("event-x", onEventX);
window._once("event-once", ev => console.log("event-once 收到数据:", ev.detail));
// once
window._emit("event-once", { uid: -100, message: "you love me" });
window._emit("event-once", { uid: -100, message: "you love me" });
// 订阅和取消订阅
window._emit("event-x", { uid: 100, message: "i love you" })
window._off("event-x", onEventX);
window._emit("event-x", { uid: 100, message: "i love you" })
复制代码


输出结果




1.JPG


是不是有点小惊喜。


原理浅析



window是表象,根源是 EventTarget


其一共三个方法,也正是这三个方法,让其自身是一个订阅发布中心:



Window的继承关系:


2.JPG


Document的继承关系:


3.JPG


Element的继承关系:


4.JPG


所以document和window对象均是一个订阅发布中心。

更重要的是我们常用的div, span, input等等nodeType为1的元素节点,也统统是一个订阅发布中心。


假如你连nodeType也不清楚,没关系,请参见Node.nodeType


当前版本的问题


  1. 不能多实例化啊
  2. 挂载window上太丑了
  3. 不能多参数啊
    答:要那么多参数干嘛
  4. 参数从ev.detail上获取
    答:还好
  5. 不能在node, web worker中使用啊
    答:node要你写吗, 自带啊。 web worker嘛,确实。
  6. ........


到这里,我不生气,真的不生气, 特定场景解决特定问题就完毕了。 1毛钱还想上天啊。


但是就算是1毛钱,我也希望大家获得更好的体验,所以要改造升级。


3以及之后的别想了,我们把1,2点进行完美升级。


升级



升级后的代码会多一点,2倍吧,一共6行代码


代码


class EventEmitter extends EventTarget {
    on = this.addEventListener;
    off = this.removeEventListener;
    emit = (type, data) => this.dispatchEvent(new CustomEvent(type, { detail: data }));
    once = (type, callback) => this.on(type, callback, { once: true, capture: true });
}
复制代码


测试代码


var emitter = new EventEmitter();
        function onEventX(ev) {
            console.log("event-x 收到数据:", ev.detail);
        }
        // 订阅
        emitter.on("event-x", onEventX);
        emitter.once("event-once", ev => console.log("event-once 收到数据:", ev.detail));
        // 发布
        emitter.emit("event-once", { uid: -100, message: "you love me" });
        emitter.emit("event-once", { uid: -100, message: "you love me" });
        emitter.emit("event-x", { uid: 100, message: "i love you" })
        emitter.off("event-x", onEventX);
        emitter.emit("event-x", { uid: 100, message: "i love you" })
复制代码


完美,名字好看了,使用方便了,也支持多实例了。


结果


5.JPG


总结



是不是很简单,其实不用第三方库,你也可以拥有订阅发布中心,就这么简单。

要是都看到这了,都不点个赞,那就是你的不对了。

相关文章
|
7月前
|
敏捷开发 自然语言处理 测试技术
云效产品使用常见问题之webhook 触发,不能将运行备注填充进运行历史如何解决
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
7月前
|
移动开发 小程序 Go
【社区每周】小程序消息订阅插件升级为消息订阅接口(2022年8月第五期)
【社区每周】小程序消息订阅插件升级为消息订阅接口(2022年8月第五期)
50 0
|
开发者
评审不通过开发者的提交工具一直显示推送状态,必须通过后推送的信息才会消失
在使用sourcetree时,开发者提交推送代码后,评审不通过,sourcetree上边一直显示推送的状态,只有通过评审推送状态才会消失。
|
存储 缓存 监控
聊聊消息中心的设计与实现逻辑
消息通知的流程设计,在各个业务线中通过消息中心提供的接口方法,将不同场景下的消息内容提交到消息中心,消息中心进行统一维护管理,并根据消息的来源和去向,适配相应的推送逻辑。
1210 0
聊聊消息中心的设计与实现逻辑
|
存储 Kubernetes 负载均衡
【k8s 系列】k8s 学习二十六,有状态的应用如何部署 1?
前面我们分享很多关于 K8S 的内容,有没有发现 pod 都是无状态,RS / RC 管理的 pod 也是无状态的,我们可以任意删除一个 pod,副本管理器又会马上给我们创建一个 pod 那么如果咱们的这个 pod 是有挂载持久卷的,那么我们用老方法可还行?
196 0
|
Web App开发 安全
【信仰充值中心】Firefox 97 后续更新一览
【信仰充值中心】Firefox 97 后续更新一览
104 0
|
Prometheus Kubernetes Cloud Native
Flagger(应用自动发布)介绍和原理剖析
## 简介 [Flagger](https://github.com/weaveworks/flagger)是一个能使运行在k8s体系上的应用发布流程全自动(无人参与)的工具, 它能减少发布的人为关注时间, 并且在发布过程中能自动识别一些风险(例如:RT,成功率,自定义metrics)并回滚. ## 主要特性 ![features](https://intranetproxy.ali
4523 0
|
Java 微服务
Java报告推送失败补偿机制;钉钉群通知消息核心代码
Java报告推送失败补偿机制,超过次数后使用钉钉通知开发 自动补偿实现: 要求方法调用的过程中,失败的时候,系统有办法进行自动重试,重试达到一定次数后,钉钉通知开发。 实现设计:注解,反射,定时任务
333 0
Java报告推送失败补偿机制;钉钉群通知消息核心代码
|
设计模式 存储 安全
一文带你彻底搞懂发布与订阅设计
我们常说的发布订阅设计模式,也叫观察者模式,也就是事件监听机制,观察者模式订阅了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象,当这个主题对象发生改变时,会通知所有的观察者对象,使他们能够自动的更新自己!
一文带你彻底搞懂发布与订阅设计
|
达摩院 算法 决策智能
划重点|iOS15正式发布, 全新的通知推送系统,你必须要知道!
今年友盟+联合达摩院决策智能实验室讲算法技术,推出国内首个智能推送功能,帮助产品运营人员实现一键式触达的精细化运营。通过精心打磨的在线学习与优化算法,对推送人群与推送文案进行精准匹配,最大化用户点击量。通过对不同用户场景感知和各种约束配额下的最佳分配,将无用推送信息降权显示,降低对用户的干扰,优化用户维度的推送体验。
划重点|iOS15正式发布, 全新的通知推送系统,你必须要知道!