当其他 observable 为真时从 observable 中取出项目

Take items from observable when other observable is true

如何根据另一个可观察对象 b 的(布尔)值来控制通过可观察对象 a 推送哪些项目?

我的意思是,仅当 b 发出的最后一个项目为真时,才会推送 a 中的项目。

可观察序列 b 应该像一个通过过滤器。

好的,我想我至少有一个解决方案 可以通过 WithLatestFromWhere.

的组合来完成

在我的真实代码中,我有这个:

  • 视频中位置的可观察值
  • 布尔值的可观察值,指示用户是否已开始 'seeking' 操作(通过在视频播放器中任意拖动拇指)
positionObs
   .WithLatestFrom(isSeekingObs, (pos, isSeeking) => new { pos, isSeeking })
   .Where(x => !x.isSeeking)
   .Select(x => x.pos);

它必须结合最近的两个值并对“信号器”应用过滤器。

无论如何,我想知道是否有更清洁的解决方案。

我做这种事情的首选方法是结合使用 PublishSwitch

方法如下:

Subject<bool> subject_b = new();
IObservable<bool> observable_b = subject_b.AsObservable();

IObservable<long> observable_a = Observable.Interval(TimeSpan.FromSeconds(1.0));

IObservable<long> observable_c =
    observable_a
        .Publish(published_a =>
            observable_b
                .Select(value_b =>
                    value_b
                        ? published_a
                        : Observable.Never<long>()))
        .Switch();

IDisposable subscription = observable_c.Subscribe(Console.WriteLine);
        
Thread.Sleep(TimeSpan.FromSeconds(2.5));
subject_b.OnNext(true);
Thread.Sleep(TimeSpan.FromSeconds(3));
subject_b.OnNext(false);
Thread.Sleep(TimeSpan.FromSeconds(4));
subject_b.OnNext(true);

给出:

2
3
4
9
10
11
12
13
14
...

WithLatestFrom 相比,我更喜欢 Publish/Switch,因为前者可以处理更多类型的查询,而后者不能。