наблюдать несколько IObservable параллель - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть Session и Service. Service может иметь несколько Sessions. Каждый Session получил IObservable<SessionState> свойство.

Чего я хочу достичь:

Если все Session.States равны NotConnected, тогда Service должен вызвать Foo(). У меня уже есть решение, но я не думаю, что это reactive way, как это сделать.

public class Session
{
    public SessionState ActualState => _SessionStateSubject.Value;
    public IObservable<SessionState> State => _SessionStateSubject.AsObservable();
    private readonly BehaviorSubject<SessionState> _SessionStateSubject = new BehaviorSubject<SessionState>(SessionState.NotConnected);

    public void Initialize()
    {
        _SessionStateSubject.OnNext(SessionState.Initializing);
    }
}

public class Service
{
    private List<Session> _Sessions = new List<Session>();

    public void SubscribeToChannels()
    {
        foreach (Session session in _Sessions)
        {
            session.State.TakeUntil(s => s == SessionState.NotConnected).Subscribe(state =>
            {
                // check all other sessions
                if(_Sessions.All(s => s.ActualState == SessionState.NotConnected))
                    Foo();
            });
        }
    }

    public void Foo()
    {
        // this should be called if all of them are 'NotConnected'
    }
}

1 Ответ

3 голосов
/ 06 февраля 2020

Вы можете использовать CombineLatest, чтобы получить список последних известных состояний всех элементов в любое время, когда произошли изменения. С этого момента он просто проверяет, все ли состояния NotConnected.

    public IDisposable SubscribeToChannels()
    {
        return Observable
               .CombineLatest(_Sessions.Select(s => s.State))
               .Subscribe(states =>
               {
                   if (states.All(s => s == SessionState.NotConnected))
                        Foo();
               });
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...