2017-01-16 36 views
2

在很多情况下,我发现自己需要从可观察值访问最近发射的值。我做这件事的方式是通过订阅可观察值和缓存值,因为它们出现。例如见下文。然而,我看到有一堆像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); 
} 
+0

你最终使用了我的一些建议还是你实现了自己的方法? – supertopi

+1

我想尽量避免需要这样做,而且我最大限度地围绕observables和围绕可变变量构造我的代码,这样做更容易。如果我想要最近,我使用CombineLatest或WithLatestFrom。 – JustinM

回答

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您必须申请并获得最新值(虽然只有一个值处置之前发出)。

+0

BehaviorSubject没有解决具有IObservable并希望获取最新值的问题。如果我有一个BehaviorSubject开头,我只需调用.Value方法。记得TakeLast很有帮助 - 可能还有其他类似的探测方法 - 只有在订阅时才真正做到。 – JustinM

相关问题