【问题标题】:Rx Observable Window with closing function with parameterRx Observable Window 带参数的关闭函数
【发布时间】:2014-09-08 10:50:13
【问题描述】:

我正在尝试将可观察对象分离到窗口中(或者出于我的目的,缓冲区也可以),同时能够在自定义位置关闭窗口/缓冲区。

例如我有一个 observable,它产生从 1 开始向上移动的整数。我想在每个可被 7 整除的数字处关闭一个窗口。在这种情况下,我的关闭函数需要将项目作为参数。

Window 方法重载:

Window<TSource, TWindowClosing>(IObservable<TSource>, Func<IObservable<TWindowClosing>>)

要么无法使用此重载来完成,要么我无法绕过它。 Documentation describes that it does exactly what I want 但没有显示示例。此外,它还展示了一个非确定性关闭的示例,这取决于关闭可观察集合发出项目的时间。

Window 操作符将一个可观察的序列分解成连续的 非重叠窗口。当前窗口的结束和开始 下一个窗口由一个可观察的序列控制,即 作为输入传递的 windowClosingSelect 函数的结果 操作员的参数。运算符可用于对集合进行分组 事件进入一个窗口。例如,事务的状态可能是 被观察到的主要序列。这些状态可能包括: 准备、准备、活动和承诺/中止。主要序列 可以包括所有这些状态,如果它们按顺序出现的话。这 windowClosingSelect 函数可以返回一个可观察的序列 仅在 Committed 或 Abort 状态下产生值。这个会 关闭代表特定交易事件的窗口 交易。

我在想像下面这样的东西可以完成这项工作,但我必须自己实现它:

Window<TSource, TWindowClosing>(IObservable<TSource>, Func<TSource, bool>)
  • 是否可以使用内置函数进行这种窗口化(我知道我可以自己构建一个)?
  • 是否可以根据发射的项目关闭窗口,或者仅在非确定性的情况下,从可观察窗口中发射项目后?

【问题讨论】:

标签: system.reactive


【解决方案1】:

使用带有Where 子句的原始序列作为结束序列。如果您的源序列很冷,请使用Publish 和RefCount 使其正常工作。

var source = ...;
var sharedSource = source.Publish().RefCount();
var closingSignal = sharedSource.Where(i => (i % 7) == 0);
var windows = sharedSource.Window(() => closingSignal);

【讨论】:

  • 谢谢。我已经尝试过它并看到它有效,但是如果您足够关心,我有一个后续问题:) 具有关闭功能的窗口是否通过计算在发出项目之前迭代关闭功能的次数来工作?另外,我试过的没有RefCount,所以谢谢你提到它。您可能在以后的调试中为我节省了一些时间。
  • 不,Window 首先调用关闭函数来获取信号。然后它订阅返回的 observable。每当该 observable 产生一个值(任何值都可以)时,它会从 observable 取消订阅,关闭窗口,启动一个新窗口,调用关闭函数来获取一个新的 observable 并订阅它。所以它只是在需要新信号时调用关闭函数。
  • @NikolaRadosavljević RefCount 不是必需的。它具有非常具体的行为,您在使用它之前应该注意这些行为。有时在设置完所有订阅后致电Connect 是更好的选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多