在 ReactiveX 中为另一个主题创建计算主题

Posted

技术标签:

【中文标题】在 ReactiveX 中为另一个主题创建计算主题【英文标题】:Create a computed Subject for another Subject in ReactiveX 【发布时间】:2021-05-27 12:55:35 【问题描述】:

RX 中的Subject 可以存储价值并被其他人订阅。我可以知道是否有办法使Subject 依赖于另一个Subject 作为源Subject 的计算版本?

【问题讨论】:

【参考方案1】:

在某种程度上......是的!

可以定义彼此之间的可观察流。因此,虽然从另一个主题创建“计算主题”可能没有真正意义,但您可以创建一个依赖于主题的可观察对象,从而产生一个可在源主题发出时发出的可观察对象。

示例:(StackBlitz)

const user$ = new Subject<User>();  // Subject source

const greeting$ = user$.pipe(       // Observable source
    map(user => `Hello $user.name!`)
);

user$.subscribe(
    val => console.log('user$: ', val)
);

greeting$.subscribe(
    val => console.log('greeting$: ', val)
);

user$.next( id: 1, name: 'mannok'   );
user$.next( id: 2, name: 'BizzyBob' );

// Output:
// >  id: 1, name 'mannok' 
// > Hello, mannok!
// >  id: 2, name 'BizzyBob' 
// > Hello, BizzyBob!

greeting$ 派生自 user$,因此每当 user$ 主题发出时,greeting$ 也会发出。

【讨论】:

非常感谢。我爱你的例子。顺便说一句,对于任何寻找 C# 解决方案的人,您可以使用 observable.Select(/* you lambda function used to transform */) 顺便说一句,对于Subject,我可以通过访问.Value(在Rx.NET 中)来获取它的当前值。您提供的解决方案无法获得greeting$ 的当前值。有什么建议可以检索派生 Observable 的当前值吗? 我对@9​​87654334@ 不是特别熟悉,但通常可观察对象只是值流过的流,并且可观察对象本身不会跟踪最后发出的值。即使是 rxjs 中的基本 Subjects 也不提供此功能(Get value from Subject?),但 BehaviorSubject 有一个 getValue() 方法用于此目的。但是,从主题/行为主题派生的可观察对象只是普通的可观察对象,没有 getValue() 方法。 :-(

以上是关于在 ReactiveX 中为另一个主题创建计算主题的主要内容,如果未能解决你的问题,请参考以下文章

R语言社区主题检测算法应用

如何使用 Lwiit 资源编辑器创建主题或 GUI?

如何在 hsql 中为另一个架构所有者创建表

是否可以在 jquery 函数中为 JQuery UI 工具提示设置不同的 UI 主题

实现用户选择主题

如何在 VSCode 用户设置中为深色和浅色主题指定颜色