我正在寻找具有以下语义的Rx运算符:
Observable<int> inputValues = …;
Observable<bool> gate = …;
inputValues
.combineLatest(gate)
.filter((pair<int, bool> pair) -> { return pair.second; })
.map((pair<int, bool> pair) -> { return pair.first; });
它从第一个Observable发出值,而第二个Observable的最新值是true
。使用combineLatest
,当第二个Observable 变为 true
时,我们也会得到一个值。如果我们不希望这样,我们可以使用withLatestFrom
代替combineLatest
。
此运算符是否存在(在任何Rx实现中)?
答案 0 :(得分:2)
我很抱歉给你C#代码,但是这是如何编写的。希望有人可以为我翻译。
使用.Switch
运算符。它通过仅返回由外部observable返回的最新observable生成的值,将IObservable<IObservable<T>>
转换为IObservable<T>
。
var _gate = new Subject<bool>();
var _inputValues = new Subject<int>();
IObservable<int> inputValues = _inputValues;
IObservable<bool> gate = _gate;
IObservable<int> query =
gate
.StartWith(true)
.Select(g => g ? inputValues : Observable.Never<int>())
.Switch();
query
.Subscribe(v => Console.WriteLine(v));
_inputValues.OnNext(1);
_inputValues.OnNext(2);
_inputValues.OnNext(3);
_gate.OnNext(false);
_inputValues.OnNext(4);
_inputValues.OnNext(5);
_gate.OnNext(true);
_inputValues.OnNext(6);
这会产生:
1 2 3 6
如果inputValues
是ReplaySubject
,那么您可以执行此操作以使查询正常运行:
IObservable<int> query =
inputValues
.Publish(i =>
gate
.StartWith(true)
.Select(g => g ? i : Observable.Never<int>())
.Switch());