2010-03-05 85 views
7

給定一個BehaviorSubject,調用所有這些不同的函數之間有什麼實際區別?所有這些Reactive Observable擴展之間的實際區別是什麼?

  • 第()
  • 最後()
  • LatestValue()
  • MostRecentValue()
  • NextValue()
  • 單()
  • 採取(1)

假設我明白了,他們都應該做同樣的事情,給定BehaviorSubject。

如果是這樣,那麼哪個呼叫是最合適的(我的意思是:哪一個最能傳達我的意圖)?首先還是單身?

如果不是,那麼實際區別是什麼?

回答

6

First,Last,and Single are blocking;建議使用Take(1),以便獲得IObservable。當鏈接查詢運算符時,建議避免First,Last和Single,因爲您退出monad的安全性...也就是說,您已阻止副作用。有關更多信息,請參閱http://blogs.msdn.com/jeffva/archive/2009/12/09/first-last-contains-etc-can-be-extremely-dangerous-yet-extremely-useful.aspx

MostRecentValue和LatestValue已從最新版本的Rx中刪除,因爲它們也被阻塞,所以根據最新發行說明,剩下的唯一阻塞運算符是First,Last和Single(以及xxxOrDefault變體)。

MostRecent將返回最後一個採樣值,就像您經常調用的那樣(並且它需要一個initialValue來保證它永遠不會等待),即「沒有消耗」,而Latest將等到某個值到達時返回「消費「 - 也就是說,如果再次調用Latest,它將不會返回與上次調用相同的值,它將等待直到下一個值到達(如果有的話)。

0

非常感謝@RichardHein。

阻塞擴展方法應該被移到自己的名稱空間中,所以開發人員必須專門選擇將它們包含在項目中(或者特別是CS文件)。你用Rx增加了很多複雜性,並且通過意外地使用阻塞方法,你基本上可以回到IList/IEnumerable。

我認爲這是Rx團隊所犯的最大錯誤,我認爲通過默認包括這些,他們錯過了Rx的'成功之坑'。解決這個問題,當我在C#中使用單線程+異步時(即爲什麼.NET比NodeJS更強大),我會將Rx稱爲選擇的API。

相關問題