当前位置: 首页 > 知识库问答 >
问题:

在RxJs v5中,如何从主题创建可观察的对象,而不将主题暴露给消费者

詹联
2023-03-14

我试图从使用Rx的函数返回一个可观测值。内部主题。当然,与任何好的API一样,实现细节应该完全从消费者那里抽象出来。但是,使用主题。asObservable()任何使用者似乎都可以向所有观察者发出新值。

例子:

const subject = new Rx.Subject();
const observable = subject.asObservable();

observable.source === subject; // true

observable.forEach(value => console.log(value));
observable.source.next('Hello'); 
// Causes the forEach above to print "Hello"

所以我的问题是,有没有一种内在的方法可以让消费者在不接触到原始主题的情况下看到可观察到的?如果不是的话,这显然是RxJs的糟糕设计。

注意:这是针对RxJS v5的

共有1个答案

黄弘新
2023-03-14

据我所知,真正封装它的唯一方法是在函数中订阅主题,并返回另一个(主题或自定义可观察的)发出这些值的主题。

但是任何操作符(即使是创建操作符,如Observable.combinelatetest(subject))都有一些方法来访问源代码。

“解决”这个问题的另一种方法是使用Typescript,因为TS编译器会告诉您,您无法访问可观察的上的受保护属性,因为它不是公共属性:https://github.com/ReactiveX/rxjs/blob/master/src/Observable.ts#L30-当然,在ES5中没有“受保护”这样的东西,因此它仍然可以通过控制台访问,例如。

 类似资料:
  • 我试图将一个角度函数转换为可观察模式,因为它的当前实现与它有一些异步性。为了讨论这个问题,我们举一个简单的例子。 可以通过以下方式将其转换为使用可观察对象: 我所面临的问题(据我所知)是针对无法访问内部选择语句的情况。 如果使用常规主题,订阅函数肯定不会得到任何值,因为事件的顺序是: 函数被调用 主题已创建 值已设置 调用函数订阅,因此仅在此事件发生后获取值 如果使用了BehaviorSubjec

  • 问题内容: 在我的工作中,我与docker一起工作,而该选项的工作方式就像将docker容器端口转发到机器的超级按钮一样。这使我可以通过示例添加使用某些端口的艰苦任务: 在9001端口为我的覆盖率报告提供帮助 我的应用程序的本地部署版本在端口9000中提供 手表实时重新加载端口35729 对于单元测试运行器,请使用9876端口 当我开始在Mac中使用Docker时,我遇到的第一个问题是:该选项不再

  • 我的问题与单个消费者从多个话题消费有关。假设所有主题都加载了1M个记录,一个使用者必须处理这些记录。它将按照什么顺序从主题中读取(我的意思是首先读取哪个主题/分区,等等) Kafka内部资料的任何链接会有帮助吗?

  • 我正在开发一个spring boot kafka消费者应用程序。它将有不同的消费者在不同的主题上工作。使用者的所有信息都来自application.yml文件。 我无法将应用程序属性中的主题列表设置到KafKalistener。 在这两种情况下,我都得到以下错误: java.lang.IllegalArgumentException:无法解析占位符 从应用程序属性获取主题并将其设置在KafkaLi

  • 在附加新主题的消费者之前,我创建新主题并在apache Kafka中生成第一条消息。然后附加新主题的消费者,但第一条消息无法消费。为什么..? 这是我的测试用例。 但在附加了新主题的消费者后,我会生成第二条消息,然后再正常消费。