2015-05-29 16 views
5

2 Arten A und B mit Standardwerten d(A) & d(B) gegeben. und 2 Themen:über Rx CombineLatest und Standardanfangswert

let sa = new Subject<A>() 
let sb = new Subject<B>() 

Und eine Funktion f vom Typ A -> B -> C

ich diese beobachtbaren erstellt:

let o = Observable.CombineLatest(sa, sb, f) 

Ich brauche aber o einen Anfangswert auf den d(A) & Basis zu produzieren d(B). Die Dokumentation sagt, dass CombineLatest erst dann seine erste Ausgabe produzieren wird, wenn beide Subjekte ihre erste Ausgabe produziert haben.

Ich habe 2 Ansätze, aber ich weiß nicht, welche funktionieren wird/welche ist die beste oder wenn ich einen Operator vermisse, der bereits tut, was ich brauche.

Der erste Ansatz kam ich manuell OnNext zu sa und sb mit den Standardwerten aufzurufen, nachdem die relevanten Beiträge zu o vorgenommen wurden.

Mein zweiter Ansatz ist es, BehaviorSubject s anstelle von einfach Subject s zu verwenden, sie mit den Anfangswerten zu erstellen und hoffe, dass CombineLatest das für seine erste Ausgabe verwenden wird.

Danke fürs Lesen.

Nachtrag Ich habe bestätigt, dass der zweite Ansatz funktioniert, aber ich weiß nicht, noch eine BehaviorSubject statt einer einfachen Subject ist die beste für diesen Fall, wenn die Einführung.

Antwort

12

Wie wäre es mit StartWith?

public static Observable<T> StartWithDefault(this Observable<T> observable) { 
    return observable.StartWith(default(T)); 
} 

Dann:

sa.StartWithDefault().CombineLatest(sb.StartWithDefault(), f) 
+1

Es gibt tatsächlich einen '.StartWith' Betrieb besonders für diesen Fall. –

+0

@FyodorSoikin Noch besser. –

+0

Thx. Wie schwer wäre es gewesen, das hier zu erwähnen, wenn man genau über dieses Problem spricht! https://www.learnrxjs.io/operators/combination/combinelatest.html –