2016-10-20 3 views
8

Ich versuche Observable.forkJoin zu verwenden und der Subskriptionshandler wird nie getroffen. Der forkJoin-Operator arbeitet für mich in anderen Teilen meiner App und der einzige Unterschied, den ich mir im nicht arbeitenden Szenario vorstellen kann, ist, dass die Observables von BehaviorSubject-Objekten mit der asObservable()-Funktion erstellt werden.Angular 2 rxjs Observables erstellt von BehaviorSubject funktionieren nicht mit ForkJoin

getroffen wird

Diese abonnieren
let obs = Observable.of(1); 

    Observable.forkJoin(
     obs 
    ).subscribe(data => { 
     console.log(data); 
    }); 

Dieses nicht

let bs = new BehaviorSubject<number>(1); 
    let obs = bs.asObservable(); 

    Observable.forkJoin(
     obs 
    ).subscribe(data => { 
     console.log(data); 
    }); 

Natürlich in meinem realen Anwendungsfall mehr als eine obseravble ist, weshalb ich forkJoin in der ersten bin mit Ort.

Gibt es noch etwas, das an BehaviorSubject getan werden muss, damit es mit forkJoin funktioniert?

UPDATE:

die RxJs docs etwas Nach der Untersuchung erkannte ich, dass die Observable.combineLatest war viel besser geeignet, um mein Bedürfnis als forkJoin ... Link hier im Falle kommt jeder auf dieses SO Beitrag: http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-combineLatest

Antwort

6

Das Problem ist, dass forkJoin die Observablen verbindet, wenn sie abgeschlossen sind.

In Ihrem ersten Snippet erstellen Sie eine Observable mit of - die bei subscribe sofort einen Wert ausgibt und dann abschließt.

In Ihrem zweiten Snippet wird die BehaviorSubject nicht abgeschlossen. Wenn Sie complete aufrufen würden, würden Sie den in der Konsole protokollierten Wert sehen:

let bs = new BehaviorSubject<number>(1); 
let obs = bs.asObservable(); 

Observable.forkJoin(
    obs 
).subscribe(data => { 
    console.log(data); 
}); 

bs.complete(); 
+3

Danke für die Antwort. Nachdem ich die Dokumente der RxJs ein wenig genauer untersucht hatte, wurde mir klar, dass das 'Observable.combineLatest' viel besser für meine Bedürfnisse geeignet war als' forkJoin' ... Link für den Fall, dass jemand auf diesen SO-Beitrag stößt: http://reactivex.io/ rxjs/class/es6/Observable.js ~ Beobachtbar.html # static-method-combineLatest – cboston

Verwandte Themen