【问题标题】:Caching the last emitted value from an observable缓存 observable 最后发出的值
【发布时间】:2017-01-18 16:14:31
【问题描述】:

在许多情况下,我发现自己需要从 observable 访问最近发出的值。我这样做的方法是订阅可观察和缓存的值,因为它们出现。例如,请参见下文。但是我看到有一堆方法,如 Observable.MostRecent、Observable.Latest、Replay(1) 等,它们似乎可以完成我正在寻找的东西,但我不知道如何使用它们。有没有比我下面使用的方法更好的方法?

public class WordPrinterWithCache
{
    string _lastWord = string.Empty;

    public WordPrinterWithCache(IObservable<string> words)
    {
        words.Subscribe(w => _lastWord = w);
    }

    public void PrintMostRecent() => Console.WriteLine(_lastWord);
}

【问题讨论】:

  • 您最终是采用了我的一些建议还是实现了自己的方法?
  • 我试图完全避免需要这样做,而且我将代码构建在可观察对象周围而不是可变变量周围,这样做更容易。如果我想要最新的,我使用 CombineLatest 或 WithLatestFrom。

标签: system.reactive


【解决方案1】:

在实现此行为时,我会考虑以下两种方法。

var bs = new BehaviorSubject<long>(0); //initial value
source.Subscribe(bs.OnNext);
Console.WriteLine(bs.Value); 

使用BehaviorSubject,您可以通过属性访问最新值。

var ls = source.TakeLast(1);
bs.Subscribe(Console.WriteLine);

使用TakeLast,您必须订阅才能访问最新值(尽管在处理之前只发出一个值)。

【讨论】:

  • BehaviorSubject 没有解决拥有 IObservable 并希望获得最新值的问题。如果我有一个 BehaviorSubject 开头,我只需调用 .Value 方法。有助于记住 TakeLast - 可能还有其他类似的发声方法 - 只有在您订阅时才会真正做一些事情。
猜你喜欢
  • 1970-01-01
  • 2020-11-03
  • 1970-01-01
  • 2018-12-16
  • 2023-02-25
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 2016-04-15
相关资源
最近更新 更多