2016-05-06 7 views
1

Ich benutze Betreff von reactivex in meiner angular2 App, um ein Ereignis zu signalisieren.Wie man frokJoin von Observable mit einem eigenen Ereignis verwendet

Wenn ich so etwas tun:

let subject1 = new Subject<string>(); 
let subject2 = new Subject<string>(); 
subject1.subscribe(data=>console.debug(data));   
subject2.subscribe(data=>console.debug(data));   
subject1.next("this is test event1"); 
subject2.next("this is test event2"); 

alles funktioniert gut, aber ich möchte warten beide Ereignisse auszulösen, dann einige Aktionen ausführen. Ich habe Observable.forkJoin gefunden, aber ich kann es nicht mit Subjekten arbeiten lassen. Code wie dieser funktioniert nicht

Observable.forkJoin(
      subject1.asObservable(), 
      subject2.asObservable() 
     ).subscribe(
      data => { 
       console.debug("THIS IS MY FJ"); 
       console.debug(JSON.stringify(data)); 
      }, 
      error=>console.error(error), 
      ()=>{ 
       console.info('THIS IS MY FJ SUCCESS'); 
      } 
     );   

Können Sie mir bitte mit diesem Problem helfen.

Mit freundlichen Grüßen Krzysztof Szewczyk

+0

ist ein Fehler aufgetreten? – echonax

+0

@echonax nein, nichts, nur abonnieren Methode onNext heißt nie –

+0

Nebenbei funktioniert es nicht, weil Sie 'complete' auf dem' Subject' nennen müssen, um eine Emission von 'forkJoin' zu bekommen – paulpdaniels

Antwort

2

In Ihrem Fall müssen Sie stattdessen den zip Operator verwenden. Dieser Operator wird die spezifizierten beobachtbaren Sequenzen zusammenführen, während die forkJoin alle beobachtbaren Sequenzen parallel laufen lässt und ihre letzten Elemente sammelt.

So der forkJoin Operator ist in Ordnung mit HTTP Observables zum Beispiel, aber nicht mit Themen.

Hier ist ein Beispiel.

export class App { 
    subject1: Subject<string> = new Subject(); 
    subject2: Subject<string> = new Subject(); 

    constructor() { 
    this.subject1.subscribe(data=>console.debug(data));   
    this.subject2.subscribe(data=>console.debug(data));   

    Observable.zip(
     this.subject1, 
     this.subject2 
    ).subscribe(
     data => { 
     console.debug("THIS IS MY FJ"); 
     console.debug(JSON.stringify(data)); 
     }, 
     error=>console.error(error), 
    ()=>{ 
     console.info('THIS IS MY FJ SUCCESS'); 
     } 
);   
} 

test() { 
    this.subject1.next("this is test event1"); 
    this.subject2.next("this is test event2"); 
} 

Siehe die entsprechenden plunkr: https://plnkr.co/edit/X74lViYOgcxzb1AjC9dL?p=preview.

Verwandte Themen