rxjs 主题应该在课堂上公开吗?

2024-06-19

假设我有两个类,您可以在其中观察一些可观察量。

第一个例子,公共主题:

class EventsPub {
   public readonly onEnd = new Subject<void>();
}

第二个例子,具有私有主题和注册方法:

class EventsPriv {
   private readonly endEvent = new Subject<void>();

   public onEnd(cb: () => void): Subscription {
       return this.endEvent.subscribe(cb);
   }
}

第一个例子在某种程度上是不安全的,因为任何人都可以调用eventsPub.endEvent.next()然而,与示例 2 相比,它允许使用管道,这是一个很大的优点,因为开发人员可以使用管道。仅注册第一个活动eventsPub.onEnd.pipe(first()).subscribe(cb).

第二个示例也允许一次性订阅,但需要更多代码并且取消订阅也很糟糕。

const subscription = eventsPriv.onEnd(() => {
    // logic..
    subscription.unsubscribe()
});

从您的角度来看,哪条路是最好的?或者也许有更好的解决方案?


这很大程度上取决于我的个人喜好,但我会这样做:

class EventsPriv {
   private readonly endEvent = new Subject<void>();

   get endEvent$(): Observable<void> {
      return this.endEvent;
   }
}

所以在课堂上我会使用endEvent虽然我仍然可以使用它,例如。在模板中obj.endEvent$ | async从外部来看,它的行为就像一个 Observable。

请注意,事实上我返回的是同一个实例Subject。唯一限制外界滥用它的东西obj.endEvent$.next()是 Typescript 的类型保护。如果我只使用 JavaScript 或者我将其类型转换为any我可以打电话next.

这实际上是推荐的暴露方式Subjects 而不是使用asObservable()操作员。您可以注意到,RxJS 5 内部到处都使用了这一点。例如,如果您查看repeatWhen概要:

public repeatWhen(notifier: function(notifications: Observable): Observable): Observable

您可以看到notifier函数接收一个 Observable 作为参数(您也可以在此处的代码中看到它https://github.com/ReactiveX/rxjs/blob/5.5.6/src/operators/repeatWhen.ts#L29 https://github.com/ReactiveX/rxjs/blob/5.5.6/src/operators/repeatWhen.ts#L29).

但是如果你查看调用该函数的代码,你会发现它们实际上传递了一个Subject而不是一个Observable: https://github.com/ReactiveX/rxjs/blob/5.5.6/src/operators/repeatWhen.ts#L114-L115 https://github.com/ReactiveX/rxjs/blob/5.5.6/src/operators/repeatWhen.ts#L114-L115.

这已经在 RxJS GitHub 页面上进行了讨论,其原因是性能以及 Typescript 类型防护就足够了。您可以在这些讨论中阅读更多内容:

  • https://github.com/ReactiveX/rxjs/pull/2408 https://github.com/ReactiveX/rxjs/pull/2408

  • https://github.com/ReactiveX/rxjs/issues/2391 https://github.com/ReactiveX/rxjs/issues/2391

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

rxjs 主题应该在课堂上公开吗? 的相关文章

  • 根据id统计div元素

    我有一个类似的页面 div div div div div div div div div div div div 我想知道 id 与表达式 box content X text 其中 X 是数字 匹配的 div 的数量 我可以使用纯 ja
  • 变量可以存储在图像或 div 标签中吗?

    我已经成功地创建了一个巨大的div其中包含许多小divs 附加到它上面 所以它创建了一个网格 我的目标是能够在每个较小的变量中存储两个变量divs 瓷砖 目前 我可以通过更改较小的图块来存储一个值innerHTML 但是 我希望能够存储的不
  • 未捕获(承诺中)DOMException:注册失败 - 清单为空或丢失

    我正在尝试使用 Polymer 实现推送通知 我跟着这个链接 https developers google com web fundamentals getting started push notifications 并能够让服务人员注
  • 如何制作可扩展的文本框?

    我想制作一本以给定宽度 高度开始的教科书 然后 如果用户输入的内容超过给定的空间量 文本框就会向下扩展 我该怎么做呢 我使用 CSS 吗 当用户超过允许的行数时 基本文本框仅显示滚动条 如何使文本框将行数再扩展 5 行
  • 基于布尔 prop 的条件字段验证

    我想要favoriteAlcohol仅当以下情况时才需要验证 需要的字段props isAdult传递给组件的是true Yup object shape favoriteAlcohol Yup string when props isAd
  • 如何将参数传递给 JHipster 中的自定义错误消息?

    我仍在学习 JHipster 所以今天我想自己进行一些验证练习 并尝试向我的前端发送有意义的错误消息 这是我尝试过的 在我的控制器中 我有以下内容 POST lessons Create a new lesson of 45 min if
  • JavaScript 设置滚动高度

    在 JavaScript 中 将一个元素的滚动高度设置为另一个元素的滚动高度的正确方法是什么 直接赋值没有效果 谢谢 格雷格 直接是不可能的 scrollHeight 是一个只读属性 包含元素内容的总高度 以像素为单位 如果有元素 A 并且
  • 使用 ES6 从子级获取父类名?

    我想获取父类名称 Parent 但我只能使用此代码检索子类名称 Child use strict class Parent class Child extends Parent var instance new Child console
  • selenium webdriver 管理器更新 - npm

    我尝试使用 webdriver manager 更新 selenium webdriver 但出现错误 Error Got error Error read ECONNRESET from https selenium release st
  • 使用 jQuery 检测用户何时滚动到 div 底部

    我有一个 div 框 称为 Flux 里面有可变数量的内容 此 divbox 的溢出设置为自动 现在 我想做的是 当使用滚动到此 DIV 框的底部时 将更多内容加载到页面中 我知道如何执行此操作 加载内容 但我不知道如何检测用户何时滚动到
  • JS - 文件读取器 API 获取图像文件大小和尺寸

    您好 我正在使用以下代码来使用文件读取器 API 获取上传图像
  • 在 React 中使用 document.querySelector?我应该使用 refs 代替吗?如何?

    我现在正在 React 中构建一个轮播 滚动到我正在使用的各个幻灯片document querySelector像这样 useEffect gt document querySelector slide activeSlide scroll
  • JavaScript 检查 null 与 undefined 以及 == 和 === 之间的区别

    如何检查变量是否null or undefined和有什么区别null and undefined 有什么区别 and 很难在 Google 上搜索 如何检查变量是否null or undefined 是变量null if a null o
  • 如何在html5画布中向前和向后移动圆圈中的对象?

    我正在 html5 canvas 中开发一个小应用程序 我需要使用键盘按键以圆周运动移动对象 我可以使用键盘按键移动对象 但存在错误 该对象不会从同一位置向后或向前移动 任何人都可以帮助我完成此操作 请检查以下代码 任何形式的帮助将非常感激
  • 包含菜单按钮的 Ag-grid 单元格

    我在我的项目中使用社区版本的 ag grid 我正在尝试在每一行的一个单元格中添加菜单按钮 单击菜单按钮时 应该会弹出菜单 其中包含编辑 删除 重命名选项 并且当单击菜单上的任何项目时 我需要触发具有行值的事件 我正在尝试创建一个将显示按钮
  • 检测 html 元素内的用户选择

    如何检测用户选择 用鼠标突出显示 是否在某个元素内 某个元素的子元素 Example div sdfsdf div some span content span div sdfsd div 伪代码 if window getSelectio
  • NESTJS AWS Lambda 和 Sequelize 连接池

    由于我已经给出了下面代码片段中提到的池参数 因此是否有必要在每次 lambda 调用后关闭连接 这个 aws lambda 函数应该每分钟触发一次 池参数仅足以关闭连接吗 export const databaseProviders pro
  • 流星与承诺

    我一直在尝试养成使用 Promise 的习惯 但在尝试在 Meteor 上下文中的服务器端代码中使用它们时遇到了问题 这就是问题 if Meteor isServer Meteor startup function code to run
  • 如何在二维数组中找到字符串?

    我有一个看起来像这样的数组 var array a b c d e f 我希望能够在数组中搜索字符串 d 并返回对应的值 c try function find str array for var i in array if array i
  • JHipster:使用标准过滤实体 - 预期的 Angular 客户端方法

    我最近开始使用JHipster http www jhipster tech 感谢这个出色项目的维护者 在 JHipster 的当前版本 撰写本文时为 4 10 2 中 实体可以通过实体子生成器启用过滤 或者通过包含filter Entit

随机推荐

  • Qt - 如何使用 QNetworkAccessmanager 获取响应文本

    这是我的代码 Widget Widget manager new QNetworkAccessManager this connect manager SIGNAL finished QNetworkReply this SLOT repl
  • 有没有办法在 Blazor 中进行外部身份验证而不使用数据库?

    所以本质上我有一个 Blazor 服务器端应用程序 我正在尝试使用 Azure AD SAML 添加外部身份验证 我在用Sustainsys Saml2 AspNetCore2用于外部身份验证的包 我不太熟悉 ASP NET 或 Blazo
  • 只有根级导航目的地对于具有同质路径的导航堆栈有效

    我正在尝试整合NavigationStack在我的 SwiftUI 应用程序中 我有四个看法 CealUIApp OnBoardingView UserTypeView and RegisterView 我想从OnBoardingView
  • 在 VB.NET 中 a = b = 5 - 不可能吗?

    VB NET 中可以这样做吗a b 5 我知道 也是比较运算符 我的意思是做not结果 例如 如果 b 2 a false b 2 然而 在下面的情况下该怎么做呢 不方便在我的代码中引起了这个问题 一些对象a b z由方法中的 ref 传递
  • Django 简单历史 - save_without_historical_record() 对我不起作用

    我花了两天时间努力完成这项工作 我正在尝试使用 Django Simple History 进行记录而不保存历史记录 情况如下 我有一个模型 class Artikel models Model treaty models ForeignK
  • 如何使用 JQuery 克隆没有事件的数据元素

    我想克隆一个
  • 将列表中的列转换为 R 中的数据框

    我有使用 R 创建的以下列表 set seed 326581 X1 rnorm 10 0 1 Y1 rnorm 10 0 2 data data frame X1 Y1 lst lt replicate 100 df smpl lt dat
  • Stripe 支付网关使用 PayumBundle 创建定期付款

    我在用支付包 https github com Payum PayumBundle将 Stripe 支付网关集成到我的 symfony2 应用程序中 我可以创建成功的直接付款 但无法创建定期付款 因为捆绑包的文档非常差 我的问题是如何使用
  • 启动同一作业的多个延迟作业进程

    我在运行多个工作人员的设置中使用延迟作业 就我的问题而言 这并不重要 但假设我运行 10 个工作线程 当前在开发模式下执行此操作 我遇到的问题是两个不同的工作人员有时开始处理同一项工作 调用我的工作对象上的执行方法 据我所知 延迟作业正在使
  • CakePHP 与 Lucene

    我正在尝试使用 cakephp 实现 Lucene 并遵循本指南http jamienay com 2010 01 zend search lucene datasource for cakephp http jamienay com 20
  • 基于 Web.Config 使用的 GAC 程序集版本

    Good Day 我有一个在 GAC 中使用自定义程序集的项目 为了能够使用它 我在中添加了对我的项目的引用 C WINDOWS Microsoft NET assembly GAC MSIL JOHN CommonLib v4 0 1 0
  • 使用 Python Win32Com.Client 发送电子邮件发送错误

    我有我的脚本通过 Python win32com client 在 Outlook 上发送消息 我可以创建电子邮件并格式化我的正文 但是当我尝试这样做时newmail Send 我收到一个我无法弄清楚的错误 下面是我的代码以及错误 obj
  • 什么是已弃用的推送转场? (iOS 8)[重复]

    这个问题在这里已经有答案了 我不知道在这种情况下已弃用意味着什么 我是编程新手 正在 Xcode 6 中制作我的前几个应用程序 今天我正在制作一个待办事项列表应用程序 当连接到用户可以输入新待办事项以添加到主表的场景时 我被邀请使用推送转场
  • JavaFX Platform.runLater 的使用以及从不同线程访问 UI

    我有几个问题Platform runLater 我有一个 JavaFX 应用程序类 在这个类中 我运行一个线程 该线程从网络套接字读取数据 现在当我创建一个新的Stage在线程内部 系统抛出异常 JavaFX 事件调度程序线程和我的网络读取
  • 如何在Java 8中实现Elvis运算符?

    我有一个经典的 Elvis 运算符 案例 其中我调用每个可能返回 null 的方法并将它们链接在一起 thing nullableMethod1 a nullableMethod2 b nullableMethod3 在 Java 8 中
  • Django查询集基于外键值的特定顺序

    对于棒球网站 我有两个模型 位置模型和球员模型 位置被命名为投手 捕手 一垒 二垒 三垒等 class Position models Model name models CharField max length 100 slug mode
  • React-chartjs-2 圆环图导出为 png

    我使用react chartjs 2库创建了一个甜甜圈图和条形图 现在我想将此图表导出为 png 即在用户单击时将图表下载为 png 我尝试了很多方法但未能成功 其中之一是使用 html2canvas 库并获取屏幕截图 但这会降低图表的质量
  • mongodb从不同数据库中选择

    我有大约 200 个 mongodb 数据库 每个数据库都有一个名为 Group 的集合 在该集合中有一个名为 meldingId 的字段 是否可以进行一个 mongodb 查询来查找不同数据库中的所有值 我设法通过 selectDB da
  • 如何从 Cursor 获取行 ID

    如何从游标获取行 ID 我不认为 Cursor 直接暴露了这一点 SQLiteDatabase insert 返回新插入行的行 ID 或者在 Android 中 惯例是有一个名为 id 包含表的主自动增量键 所以cursor getLong
  • rxjs 主题应该在课堂上公开吗?

    假设我有两个类 您可以在其中观察一些可观察量 第一个例子 公共主题 class EventsPub public readonly onEnd new Subject