手把手带你实现发布订阅模式

发布订阅是设计模式的一种。简单理解,你微信订阅了某些公众号,这些公众号发布新文章时,微信就会通知你,这就是发布订阅的一种。

vue的响应式设计就是结合了数据劫持和发布订阅模式实现的,要想理解vue的设计,就必须要搞懂发布订阅模式。

核心:订阅者,发布者,调度中心。

  • 订阅者:把自己想订阅的事件注册到调度中心。
  • 调度中心:发布者发布任务时,通知订阅者(调用订阅者注册的代码)
  • 发布者:发布任务到调度中心。

话不多说,上代码实现。

xml 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        class Publish {
            constructor() {
                // 调度中心,订阅者把自己要订阅的东西注册到这里
                // this.events = {
                //      event1: [fn1, fn2, fn3]
                //      event2: [fn1, fn2]
                //}
                this.events = {}
            }

            // 订阅,订阅者把把事件注册到调度中心
            $on(type, fn) {
                if (!this.events[type]) {
                    this.events[type] = []
                }

                this.events[type].push(fn)
            }

            // 发布,通过调度中心发布
            $emit(type) {
                if (this.events[type]) {
                    const args = Array.prototype.slice.call(arguments, 1)
                    this.events[type].forEach(fn => {
                        fn(...args)
                    });
                }
            }
        }

        const eventHub = new Publish()

        // 订阅:把事件注册到调度中心
        eventHub.$on('sum', function() {
            const total = [...arguments].reduce((x, y) => x + y)
            console.log(total)
        })

        // 发布:如果有人订阅,那么就执行注册的代码
        eventHub.$emit('sum', 1, 2, 3)
    </script>
</body>
</html>

发布订阅有很多种实现方式,这只是在Vue中的实现方式。

相关推荐
我星期八休息35 分钟前
扩展— TCP 全连接队列与 tcpdump 抓包
linux·服务器·开发语言·前端·网络·tcp/ip·tcpdump
AC赳赳老秦1 小时前
CSDN 技术社区数据采集:OpenClaw 抓取公开技术热帖,生成领域技术热点周报
java·大数据·前端·数据库·python·php·openclaw
结网的兔子1 小时前
【前端开发】Web端迁移至 uni-app 及鸿蒙扩展方案对比
前端·uni-app·harmonyos
啦啦啦啦啦zzzz2 小时前
设计模式:单例模式和工厂模式
c++·单例模式·设计模式·工厂模式
水瓶夜之2 小时前
.NET 中的新增功能系列文章——.NET SDK中的新增功能
前端·chrome·.net
笨笨狗吞噬者2 小时前
VS Code 内置浏览器打开网页
前端
SamChan902 小时前
WebSocket实现PDF翻译进度实时推送:Go后端+React前端的完整方案
前端·websocket·pdf·c#·react·机器翻译
甲维斯3 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·人工智能
奈斯先生Vector3 小时前
大模型 Agentic Workflow 架构解构:异构 API 调度与 Token 路由的多模态系统设计
开发语言·前端·架构·prompt·aigc·音视频
海带紫菜菠萝汤3 小时前
FFmpeg.wasm 实践:在浏览器中运行 FFmpeg 的能力边界与性能瓶颈
前端·javascript·ffmpeg·音视频·wasm