实现一个发布-订阅模式

2023-11-15

订阅/发布者模式
订阅发布模式:一对多的关系,让多个观察者同时监听某一个主题对象,这个主题对象的状态发生改变时就会通知所有观察者对象,中间通过一个调度中心来发布通知

function Dep(){
    this.subs = [];
}

Dep.prototype.addSub = function(sub){
    this.subs.push(sub);
}
Dep.prototype.notify = function(){
    this.subs.forEach(sub => sub.update())
}

function load1 (){}
load1.prototype.update = function(){
    console.log('load1')
}

function load2 (){}
load2.prototype.update = function(){
    console.log('load2')
}

var dep = new Dep();
var watcher1 = new load1()
var watcher2 = new load2()
dep.addSub(watcher1)
dep.addSub(watcher2)
dep.notify();
// https://www.cnblogs.com/suyuanli/p/9655699.html
class Event{
    constructor(){
        handlers = {};
    }

    on(type, handler){
        if (!(type in this.handlers)) {
            this.handlers[type] = [];
        }
        this.handlers[type].push(handler);
    }

    emit(type, ...params){
        if (!(type in this.handlers)) {
            return new Error('未注册!')
        }

        this.handlers[type].forEach(handler => {
            handler(...params);
        });
    }

    // 移除
    remove(type, handler){
        if (!(type in this.handlers)) {
            return new Error('无效事件');
        }

        if (!handler) { // 没有指明handler,移除type
            delete this.handlers[type];
        } else {
            const idx = this.handlers[type].findIndex(ele => ele === handler);
            if (idx === undefined) {
                return new Error('no')
            }
            this.handlers[type].splice(idx, 1);
            if (this.handlers[type].length === 0) {
                delete this.handlers[type];
            }
        }
    }
}

function load(params){
    console.log('load', params)
}

function foo(params){
    console.log('foo...', params)
}

var event = new Event();
event.on('load', load);
event.on('load', foo);

// 触发
event.emit('load', 'load触发')

// 移除foo
event.remove('load', foo);
event.emit('load')

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

实现一个发布-订阅模式 的相关文章

  • 仅在图像加载后应用 jQuery 瀑布“回流”

    我正在使用 jQuery 瀑布来显示网格样式 为了阻止常见的图像重叠问题 我将瀑布方法包装在 load 函数中 例如 window load function buildcontainer waterfall colMinWidth 260
  • 更新标记文本谷歌地图API

    因此 我在我的网站上使用 Google 地图 API 并且希望标记文本等于另一个 html 元素的值 这里有人知道如何更新 google 地图 API 中标记的文本属性的值吗 这是我关于该问题的代码 var map marker var i
  • 如何从浏览器打印 PDF

    在Web应用程序中 是否可以强制在客户端上打印PDF文件 如果浏览器配置为在窗口内打开 PDF 我想调用 window print 会起作用 但某些浏览器 例如我的 被配置为在外部打开 PDF 谷歌文档的做法是将 JavaScript 嵌入
  • 如何使用多重身份验证 - firebase?

    我有一个注册屏幕 其中包含 用户名 电子邮件 电话号码 密码 在本例中 我使用电话号码身份验证来验证号码 因此在用户验证他的号码后 我将他的数据保存到 firebase DB 中 所以在那之后 我将下摆导航到登录屏幕 应该包含电子邮件 密码
  • 将 PictureStream 转换为 HTML5 画布

    我正在从 net Web 服务检索图片流的字节数组 JSON 字节数组响应如下所示 137 80 78 372 617 more 我正在尝试转换这个字节数组并将其绘制到 HTML 画布中 如下所示 var context document
  • ng-include 跨域帮助 angularjs

    我正在尝试为加载到 ng include 跨域的 url 实现白名单 这是一场噩梦 我有一个在本地运行良好的包含 div div 然后我像这样添加白名单 angular module myApp ngRoute ngResource con
  • Babel NodeJS ES6:语法错误:意外的令牌导出

    我正在尝试使用 babel 来运行我的 NodeJS 程序 其中包括 ES6 语法和 Colyseus 库的导出 但是 当我运行命令时 babel node server js 出现以下错误消息 export class MyRoom ex
  • 如何在js中将嵌套的html元素提取到同一级别

    我使用 javascript 并有一个 div 元素 里面有一些 html 标签 如下所示 一些元素是嵌套的 我想将它们保持在同一级别 第一个 html 是这样的 div p some text on here 1 i some itali
  • 如何使用 jquery/javascript 在 div 内进行选择

    有很多代码可以在页面中进行选择 但我想要一个代码来在 div 内进行选择 如果选择在我的 div 之外 该函数必须返回空字符串 有一个 jquery 插件仅适用于 textarea 而不适用于 div here http plugins j
  • 无法在react-native android中设置ShadowColor

    环境 环境 操作系统 macOS High Sierra 10 13 1 节点 8 9 1 纱线 0 17 10 npm 5 6 0 守望者 4 7 0 Xcode Xcode 9 2 内部版本 9C40b Android Studio 2
  • Javascript - 将类型化数组保存为 blob 并以二进制数据读回

    我有一个充满二进制数据的类型化数组 它是从 ArrayBuffer 生成的 var myArr new Uint8Array myBuffer 我将其呈现给用户 var blob new Blob myArr type octet stre
  • 类型“AngularFirestoreCollection”上不存在属性“onSnapshot”

    我正在尝试将侦听器与云 Firebase 分离 但仍然收到此错误 类型 AngularFirestoreCollection 上不存在属性 onSnapshot 你知道我应该进口什么吗 我直接从 Firebase 文档中复制此代码 let
  • 修复了 Google 地图混搭中的图例

    我有一个带有 Google 地图混搭的页面 其中的图钉按日期 周一 周二等 进行颜色编码 包含地图的 IFrame 是动态调整大小的 因此当浏览器窗口调整大小时 它也会调整大小 我想在地图窗口的一角放置一个图例 告诉用户每种颜色的含义 Go
  • 如何在鼠标悬停时覆盖 div / box?

    我有一个链接 当用户将鼠标悬停在其上时 它应该在链接下显示一个框 div 盒子应该覆盖其下方的所有内容 我如何使用 css 或 javascript 来做到这一点 您有一个隐藏的绝对定位的 div 和链接的子级 然后 当您将鼠标悬停在链接上
  • 无法读取未定义的属性“isLoggedIn”

    此代码用于添加产品 然后添加到购物车和订单 并在后端使用 mongodb 创建 pdf 实际上 session isLoggedIn 是在 auth js 中定义的 检查该代码 但仍在 app js 中它给出了此错误 应用程序 JS代码 c
  • 如何在 Typescript 中使用默认值定义可选构造函数参数

    是否可以有带有默认值的可选构造函数参数 如下所示 export class Test constructor private foo string foo private bar string bar 这给了我以下错误 参数不能有问号和初始
  • JavaScript Element.requestFullscreen() 未定义

    如果我如何使用代码element requestFullscreen 是未定义的 if element webkitRequestFullScreen element webkitRequestFullScreen If requestFu
  • close 似乎不适用于 WebSocket

    我有这个简单的 JavaScript 代码 window ws new WebSocket ws 127 0 0 1 8000 ws onopen function ws send hello Ruby 中的服务器如下所示 require
  • 如何识别 YouTube 播放器的音量变化

    我正在使用 angualr youtube embed 指令将 YouTube 播放器嵌入到我的 Angular Web 应用程序中 因为我必须识别播放和暂停以及音量变化事件 为了监听播放和暂停事件 我使用下面给出的代码 scope on
  • Json 对象 - 获取键和值

    我是 JSON 的新手 所以 如果这是一个非常基本的疑问 请不要责骂我 我有一个 JSON 对象引用 我想获取 Key 对象只有一个键值对 我如何在 Java 中获得它 您可以使用jsonObject keys 获取所有钥匙 然后您可以迭代

随机推荐

  • YSlow--Web前端性能测试工具

    1 介绍 YSlow是Yahoo发布的一款基于FireFox的插件 这个插件可以分析网站的页面 并告诉你为了提高网站性能 如何基于某些规则进行优化 它可以分析任何网站 并为每一个规则产生一个整体报告 如果页面可以进行优化 则YSlow会列出
  • mysql workbench 错误  Error Code: 1046. No database selected Select the default DB to be used by doubl

    mysql workbench 错误 Error Code 1046 No database selected Select the default DB to be used by double clicking its name in
  • mac 本地打安卓包 platforms;android-28 Android SDK Platform 28

    A newer version of the Android SDK is required To update run Users xxx Library Android sdk tools bin sdkmanager update 转
  • 自己理解的智能指针

    看安卓内核 第一章就碰到智能指针了 看了网上的一些文章 自己实践了一下 自己的体会 普通指针直接为某个具体类型分配空间 对该空间的管理直接由指针来操作 T p new T t 智能指针相当于对该空间进行封装 智能指针实际是一个类 share
  • SPOJ QTREE4 Query on a tree IV (边分治 + 堆)

    题意 给定一棵树 节点有黑白两种颜色 有正负的边权 有两种操作 一种是修改反转某个节点的颜色 另一种是询问树上最远的两个白色节点的距离 思路 树剖 堆维护的代码还是没敢去码 以后再补了 这里用边分治 堆来维护 边分治的优点比起点分支来说 优
  • 编写一个程序,提示用户输入一周工作的小时数,然后打印工资总额、税金和净收入。

    编写一个程序 提示用户输入一周工作的小时数 然后打印工资总额 税金和净收入 首先做如下假设 基本工资 10 00美元 小时 加班 超过40小时 1 5倍的时间 税率 前300美元为15 续150美元为20 余下的为25 用 define定义
  • 【马士兵】Python基础--10(集合)

    Python基础 10 文章目录 Python基础 10 什么是集合 集合的创建 集合的相关操作 集合间的关系 集合的数据操作 集合生成式 列表 字典 元组 集合总结 什么是集合 集合的创建 集合中元素不允许重复 集合中元素无序 s 23
  • Android 去掉Button自带边框

    android background null 将边框去掉
  • Vue - 安装less-loader

    文章目录 直接安装 遇到问题 与webpack版本不兼容 查看当前使用webpack版本 查看所有webpack版本 查看less loader历史版本 安装兼容版本less loader 直接安装 npm i less loader 下面
  • 字节流和字符流的转化

    Java中字节流和字符流是可以相互转换的 OutputStreamWriter 将字节输出流转换成字符输出流 是 writer 的子类 InputStreamReader 将字节流转换成字符输入流 是Reader 的子类 一般操作输入输出内
  • AOP JoinPoint中的方法

    获取参数的值数组 Object args point getArgs 1 参数的值 获取目标对象 被加强的对象 Object target point getTarget 获取signature 该注解作用在方法上 强转为 MethodSi
  • MySQL卸载不干净回不到初始安装页面(MySQL Connector Net卸载不了),重装报错Database initialization failed等问题解决办法

    首先 这篇文章适合 1 常规卸载方法无法卸载干净导致重装始终回不到初始安装页面 即回不到下图初始状态 始终是welcome back 这部分我会单独讲一下MySQL Connector Net卸载不了的问题 2 重装过程中Database
  • java之socket编程(NIO)

    效果展示 原理分析 NIO 非阻塞型 IO 自从 jdk 1 4 之后 增加了 nio 库 支持非阻塞型 IO 操作 代码展示 package NIO import java net InetSocketAddress import jav
  • 使用 Styled Components 编写样式化组件

    本文已整理到 Github 地址 blog 如果我的内容帮助到了您 欢迎点个 Star 鼓励鼓励 我希望我的内容可以帮助你 现在我专注于前端领域 但我也将分享我在有限的时间内看到和感受到的东西 Styled Components 是一个 C
  • 【ios开发技术】Swift 语言深入--Swift设计模式 (2/2)

    Getting Started 让我们开始 你可以下载the project source from the end of part 1与我们共同来探索 这是你在第一部分结束时完成的音乐库App样品 应用程序的最初设计包括在屏幕的顶端上上水
  • Mybatis--sql多对一的处理

    我们先来看看下图所示的例子 学生和老师之间就是一种多对一的关系 对于学生这边而言 多个学生关联一个老师 多对一 这是关联 对于老师这边而言 一个老师包含多个学生 一对多 这是集合 测试多对一实例 数据库表如下图所示 步骤一 构造学生实体类S
  • 雷蛇鼠标宏文件_雷蛇毒蝰终极版无线游戏鼠标评测

    目前的游戏鼠标产品已经逐渐向着轻量化的道路发展 目前上市的鼠标中 有不少都是以极致轻盈的重量惊艳四座 不久前 一款主打轻量化的Razer Viper有线鼠标上市 作为一款中大手型鼠标 它仅有69g的重量 并且还拥有不错的操控感和性能表现 从
  • 在直流电源(Vcc)和地之间并接电容的作用

    本文整理自网络 1 在直流电源 Vcc 和地之间并接电容的电容可称为滤波电容 滤波电容滤除电源的杂波和交流成分 平滑脉动直流电压 储存电能 取值一般100 4700uF 取值与负载电流和对电源的纯净度有关 容量越大越好 有时在大电容傍边会并
  • linux 网络协议栈(链路层)

    1 int netif receive skb struct sk buff skb 该函数是网络设备驱动到链路层协议栈的接口函数 该函数最后会调用 netif receive skb core函数 下面主要介绍函数流程 1 1 list
  • 实现一个发布-订阅模式

    订阅 发布者模式 订阅发布模式 一对多的关系 让多个观察者同时监听某一个主题对象 这个主题对象的状态发生改变时就会通知所有观察者对象 中间通过一个调度中心来发布通知 function Dep this subs Dep prototype