2017-12-13 7 views
0
나는 다음과 같은 의미를 가진 수신 운영자를 찾고 있어요

:수신 운영자 : 다른 관찰 가능한에서 최신 값이 true마다 관찰 가능한 걸릴

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; }); 

그것은 처음 관찰 가능한 동안 최신 값에서의 값을 방출 두 번째 관찰 가능은 true입니다. combineLatest을 사용하면 두 번째 관찰 가능 true이 될 때 값을 얻습니다. 우리가 원하지 않으면 combineLatest 대신 withLatestFrom을 사용할 수 있습니다.

이 연산자는 (모든 Rx 구현에서) 존재합니까?

답변

2

C# 코드를 제공해 주셔서 감사합니다. 그러나이 코드를 작성하는 방법은 다음과 같습니다. 바라건대 누군가 나를 위해 번역 할 수 있습니다.

.Switch 연산자를 사용하십시오. 외부 관찰 가능 항목에 의해 반환 된 최신 관측 값에 의해 생성 된 값만 반환하여 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()); 
+0

내가 그것을 감사! 그리고 번역 할 필요는 없습니다;) 우리의 솔루션은'inputValues'가 리플레이 피사체 일 때 다른 행동을합니다. 맞습니까? 당신의 버전은'gate'가'true'가 될 때마다'inputValues'의 이전 값을 재생합니다. Mine은 구독 할 때 그리고 그 시점에서'gate'가'true' 인 경우에만 재생합니다. 그 맞습니까? – basteln

+0

@basteln - 당신은'.Publish'를 넣어 그 행동을 막을 수 있습니다. 나는 그것을 보여주기 위해 팝니다. – Enigmativity

+1

그레이트, 알겠습니다! 따라서 전체 행동을 다루는 연산자가 이미없는 것 같습니다. 다행히도이 구현을 사용하여 만듭니다. – basteln