【问题标题】:TakeUntil not working as documented?TakeUntil 没有按记录工作?
【发布时间】:2016-02-15 19:54:11
【问题描述】:

来自the docs for the TakeUntil operator(强调我的):

TakeUntil 订阅并开始镜像源 Observable。它还监视您提供的第二个 Observable。如果第二个 Observable 发出一个项目或发送终止通知,TakeUntil 返回的 Observable 将停止镜像源 Observable并终止

如果这是真的,那为什么会阻止?:

Observable.Never<Unit>()
    .TakeUntil(Observable.Empty<Unit>())
    .Wait();

【问题讨论】:

  • 从一个非终止序列中获取,直到一个空序列发出一个项目。听起来它应该无限期地阻止。
  • 你为什么认为这会抛出异常而不是永远等待?
  • @juharr:您说得对,没有发出任何项目,但Empty() 应该立即发送终止通知,不是吗?
  • @seldon 好的,我明白你现在的意思了。 TakeUntil 应该看到第二个序列已经终止,因此返回一个终止的序列,Wait 不应该阻塞,但我没有看到任何异常的原因。
  • fwiw,(旧的)MSDN Documentation 与主 Rx 站点不同,仅声明 TakeUntil“从源可观察序列返回值,直到另一个可观察序列产生值。”不考虑终止的 observables。

标签: c# .net system.reactive


【解决方案1】:

Preston Guillot 在 cmets 部分很重要:

(旧的)MSDN Documentation 与主 Rx 站点不同,仅声明 TakeUntil “从源可观察序列返回值,直到另一个可观察序列产生值。” 不考虑终止的 observables。

让我们为Observable.TakeUntil 取一个look at the source code,特别是class O,它代表“终结者”Observable。我们可以看到parent.OnCompleted 通知在O.OnNextO.OnError 上发送。

因此,您的代码阻塞的原因是 Observable.Empty(充当“终结者”)仅发出 OnCompleted 通知。

【讨论】:

  • 是时候提交 PR了!
  • @LeeCampbell 是吗? :) 如果 Observable 只完成,TakeUntil 的用户是否想要停止或继续从底层 Observable 获取值?我认为这是设计使然,非常适合操作员。
  • 可能是设计使然,因为大多数这些错误都排在 v1.1 之后。但是,从这篇文章的角度来看,它不符合最小惊喜原则的设计。 :-) ...它与ReactiveX 文档不匹配。了解设计背后的基本原理会很有趣。
  • 在使用takeUntil时,我们应该在ngOnDestroy()中使用this.destroy$.next()this.destroy$.complete()吗?
猜你喜欢
  • 1970-01-01
  • 2013-04-16
  • 2021-01-26
  • 2015-10-19
  • 2023-04-01
  • 1970-01-01
  • 2019-04-28
  • 1970-01-01
  • 2019-04-24
相关资源
最近更新 更多