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

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

【问题讨论】:

    标签: c# functional-programming rxjs reactive rx.net


    【解决方案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() 方法。 :-(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-03
    • 1970-01-01
    • 2019-07-25
    • 2016-01-08
    • 2021-09-09
    相关资源
    最近更新 更多