Rx运算符:只要其他Observable的最新值为真,就从Observable获取

时间:2017-12-13 20:33:47

标签: system.reactive

我正在寻找具有以下语义的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实现中)?

1 个答案:

答案 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

如果inputValuesReplaySubject,那么您可以执行此操作以使查询正常运行:

IObservable<int> query =
    inputValues
        .Publish(i =>
            gate
                .StartWith(true)
                .Select(g => g ? i : Observable.Never<int>())
                .Switch());