2017-01-16 84 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

相關問題