2014-04-22 6 views
1

IObservable에서 BehaviorSubject과 동일한 동작을 얻으려고합니다.IObservable의 BehaviorSubject 동작

내가 .Take(1)을 수행 할 때 기본 IObservable이 변경 될 때까지 "기본값"을 반환하고 싶습니다. 기초가되는 IObservable은 "펌프질"을 한 번 완료하고 완료됩니다.

나는 이것이 나쁜 형태라고 생각하므로 실제로는 BehaviorSubject을 사용하고 싶지 않습니다 (이 경우는 간단합니다).

이것이 가능합니까?

+0

'BehaviorSubject'가 원하는대로 정확하게 수행하는 경우 왜 나쁜 형식입니까? 원한다면'IObservable'으로 노출 될 수 있습니다. –

+0

@MatthewFinlay - 단지 개인적인 의견이지만,'.Subscribe' 메쏘드에서'Subject'를 펌프질하기 위해'IObservable'을 구독하는 것은'IObservable'을 함께 묶는 RX 패러다임에 맞지 않습니다. 'Subject'는 RX chain IMO의 맨 처음에만 있어야합니다. – Cheetah

답변

0

항상 초기 값을 갖는 스트림을 원하면 .StartWith() 방법을 사용하는 것이 좋습니다.

후드 아래에서는 .TakeUntil()이없는 경우를 제외하고 Lee의 답변과 매우 유사한 기능을 수행합니다.

구독자가 마지막 값을 즉시 수신하도록하려면이 값을 .Replay(1)과 결합해야 할 수 있습니다.

+0

그래서 제가 한 대답은'observable.StartWith (defaultValue) .Replay (1)'입니다. 누구든지 찾고있는 경우 HOT가되어 적절하게 처리해야 함을 유의하십시오. – Cheetah

1
public static IObservable<T> Behaviour<T>(IObservable<T> source) 
{ 
    return Observable.Return(default(T)).TakeUntil(source).Concat(source); 
} 
+1

이것은 관찰이 가능하고 소스가 시작된 후 누군가가 구독하면 'BehaviorSubject'와 똑같이 동작하지 않습니다. 'BehaviorSubject'는 가장 최근의 값을 바로 돌려주는 반면에 그들은 즉시 값을 얻지 못할 것입니다. –