在 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
的当前值吗?
我对@987654334@ 不是特别熟悉,但通常可观察对象只是值流过的流,并且可观察对象本身不会跟踪最后发出的值。即使是 rxjs 中的基本 Subject
s 也不提供此功能(Get value from Subject?),但 BehaviorSubject 有一个 getValue()
方法用于此目的。但是,从主题/行为主题派生的可观察对象只是普通的可观察对象,没有 getValue()
方法。 :-(以上是关于在 ReactiveX 中为另一个主题创建计算主题的主要内容,如果未能解决你的问题,请参考以下文章