2011-11-23 2 views
3

Je suis assez nouveau pour rx de sorte que les questions continuent d'apparaître :)Concaténer deux avec une action observables entre

J'ai deux séquences observables, d'abord, je veux courir un à la fin, puis commencer à vous abonner à l'autre (ils sont tous les deux froids). Je crois que Concat() le fera (veuillez me corriger si je me trompe).

Mais que se passe-t-il si je veux faire "quelque chose" après que le premier est terminé, avant que l'autre ne commence - disons par exemple de connecter quelque chose à la console?

Le code très simple que j'ai est le long des lignes de celle-ci:

var subject = new ReplaySubject<IResponse>(); 
observable1 
    .Concat(observable2) 
    .Subscribe(
     subject.OnNext, 
     () => 
     { 
      subject.OnCompleted(); 
     }); 

Puis-je faire cela?

+0

Vous souhaitez probablement .Multicast (sujet) .Connect(); ici au lieu de s'abonner –

+0

@Paul: Merci pour votre commentaire. J'ai regardé les méthodes que vous mentionnez, mais je ne suis pas sûr que ce serait mieux ici? Pouvez-vous développer sur ce sujet? :) – asgerhallas

Répondre

4

L'opérateur Do est parfait pour la journalisation et a les mêmes signatures de méthode que l'opérateur Subscribe pour que vous puissiez effectuer des actions OnNext, OnError et OnComplete.

var observable1 = Observable.Range(0,10); 
    var observable2 = Observable.Range(10, 10); 

    observable1.Do(_ => { }, 
     () => Console.WriteLine("Log First Sequence Complete")) 
    .Concat(observable2) 
    .Subscribe(i => Console.WriteLine("On Next Value {0}", i), 
     () => Console.WriteLine("Log Both Sequences Complete")); 
+0

Oui! Tous les tests passent maintenant. Merci! :) – asgerhallas

+2

Gardez à l'esprit que, puisque vos sources sont * froides *, cela signifie que si vous avez deux abonnés, vous finirez par exécuter la clause Do * deux fois *. Si vous ne voulez pas que cela se produise, vous devez utiliser Publish(), puis appeler Connect() –