当其他 observable 为真时从 observable 中取出项目
Take items from observable when other observable is true
如何根据另一个可观察对象 b 的(布尔)值来控制通过可观察对象 a 推送哪些项目?
我的意思是,仅当 b 发出的最后一个项目为真时,才会推送 a 中的项目。
可观察序列 b 应该像一个通过过滤器。
好的,我想我至少有一个解决方案
可以通过 WithLatestFrom
和 Where
.
的组合来完成
在我的真实代码中,我有这个:
- 视频中位置的可观察值
- 布尔值的可观察值,指示用户是否已开始 'seeking' 操作(通过在视频播放器中任意拖动拇指)
positionObs
.WithLatestFrom(isSeekingObs, (pos, isSeeking) => new { pos, isSeeking })
.Where(x => !x.isSeeking)
.Select(x => x.pos);
它必须结合最近的两个值并对“信号器”应用过滤器。
无论如何,我想知道是否有更清洁的解决方案。
我做这种事情的首选方法是结合使用 Publish
和 Switch
。
方法如下:
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
,因为前者可以处理更多类型的查询,而后者不能。
如何根据另一个可观察对象 b 的(布尔)值来控制通过可观察对象 a 推送哪些项目?
我的意思是,仅当 b 发出的最后一个项目为真时,才会推送 a 中的项目。
可观察序列 b 应该像一个通过过滤器。
好的,我想我至少有一个解决方案
可以通过 WithLatestFrom
和 Where
.
在我的真实代码中,我有这个:
- 视频中位置的可观察值
- 布尔值的可观察值,指示用户是否已开始 'seeking' 操作(通过在视频播放器中任意拖动拇指)
positionObs
.WithLatestFrom(isSeekingObs, (pos, isSeeking) => new { pos, isSeeking })
.Where(x => !x.isSeeking)
.Select(x => x.pos);
它必须结合最近的两个值并对“信号器”应用过滤器。
无论如何,我想知道是否有更清洁的解决方案。
我做这种事情的首选方法是结合使用 Publish
和 Switch
。
方法如下:
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
,因为前者可以处理更多类型的查询,而后者不能。