给定一个 BehaviorSubject,在其上调用所有这些不同的函数之间的实际区别是什么?
- 第一的()
- 最后的()
- 最新值()
- 最近的值()
- 下一个值()
- 单身的()
- 采取(1)
假设我理解正确,考虑到 BehaviorSubject,他们都应该做同样的事情。
如果是这样,那么哪个调用最合适(我的意思是:哪个最能传达我的意图)?第一还是单身?
如果不是,那么实际差异是什么?
给定一个 BehaviorSubject,在其上调用所有这些不同的函数之间的实际区别是什么?
假设我理解正确,考虑到 BehaviorSubject,他们都应该做同样的事情。
如果是这样,那么哪个调用最合适(我的意思是:哪个最能传达我的意图)?第一还是单身?
如果不是,那么实际差异是什么?
First、Last 和 Single 阻塞;建议改用 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 它不会返回与上次调用相同的值,它会等到下一个值到达,如果有的话。
感谢@RichardHein 的出色回答。
阻塞扩展方法确实应该被移动到它们自己的命名空间中,因此开发人员必须特别选择将它们包含在项目中(或特别是 CS 文件)。您使用 Rx 增加了大量的复杂性,并且由于不小心使用了阻塞方法,您基本上会退回到 IList/IEnumerable。
我认为这是 Rx 团队犯的最大错误,我认为默认情况下包含这些错误,他们错过了 Rx 的“成功坑”。解决这个问题,当超越 C# 中的单线程 + 异步时,我会将 Rx 称为首选 API(即为什么 .NET 比说 NodeJS 更强大)。