2016-10-28 3 views
0

Ich habe den folgenden Code:Angular 2 - Run 2 Abonnement in der gleichen Zeit

//Subscription 3: role ID to role Name 
     af.database.object('/roles/'+businessRole.$value) 
     .subscribe((roleData) => { 
     //Subscription 4: Get user info 
     af.database.object('/users/'+businessRole.$key).subscribe(user => { 

der ein Abonnement in einem Abonnement enthält.

Das Problem hier ist, dass die App auf die erste wartet, bevor die zweite läuft. Ich möchte beide auf einmal ausführen und das Ergebnis von jedem erhalten. Wie kann ich das machen?

Ich habe mit Promise.All() vor, aber:

  1. Ich würde gerne wissen, wie ich kann mit rxjs
  2. tut
  3. ich nicht einen Weg finden könnte das Ergebnis jeder beobachtbaren mit Promise.All() zu erhalten

Dank

Antwort

1

Dies schafft zwei Observables, die nach 1000ms und 900ms abgeschlossen sind. Wenn Sie diese Demo ausführen, sehen Sie, dass die erste nur einen Moment nach der ersten abgeschlossen ist, um zu beweisen, dass diese parallel ausgeführt werden.

let obs1 = Observable.of('HTTP Response 1').delay(1000); 
let obs2 = Observable.of('HTTP Response 2').delay(900); 

console.log('Start'); 

obs1.merge(obs2) 
    .subscribe(val => console.log(val), undefined,() => console.log('Completed')); 

Siehe Live-Demo: http://plnkr.co/edit/hzmpclxDkIhnfTYcWXd5?p=preview

Diese Drucke zu trösten:

Start 
HTTP Response 2 
HTTP Response 1 
Completed 

Wenn Sie forkJoin() benötigen, dann Observable.forkJoin() doesn't executes meine vorherige Antwort sehen :).

+0

Wie kann ich die Ausgabe von jeder beobachtbaren Daten? 'val' ist ein Array mit jedem beobachtbaren Ausgang? – TheUnreal

+0

@TheUnreal 'merge()' -Operator gibt Werte von allen Observablen aus, die er als Argument erhält, damit der Callback in '.subscribe()' für jede Antwort aufgerufen wird. – martin

+0

Es ist ein Problem, da ich die Ausgabe von jedem erhalten und verwenden muss, und mit dieser "merge" -Methode kann ich nicht bestimmen, welche beobachtbare jede Ausgabe erneut, habe ich mich geirrt? Zum Beispiel muss ich die Variablen "observables" in der Variablen "user" speichern und die Variable "role" für die zweite Variable. – TheUnreal

4

ich glaube Observable.forkJoin ist genau das, was Sie in Ihrer Situation zu verwenden müssen. Diese

ist, wie Sie Ihren Code wie mit forkJoin aussehen:

Observable.forkJoin(
this.http.get('/roles/'+businessRole.$value).map((response: Response) => res.json()), 
this.http.get('/users/'+businessRole.$key).map((response: Response) => res.json()) 
).subscribe(data => { 
    data[0] // this will contain roleData 
    data[1] // this will contain user 
}, 
error => console.log(error)); 

This eine nützliche Verbindung ist, wo Sie mehr über Observablen lernen können und wie forkJoin zu verwenden.

+0

Nun versuchte ich es in meinem vorherigen Post, http://stackoverflow.com/questions/40303012/observable-forkjoin-doesnt-executes – TheUnreal

+0

Große Antwort :) –

Verwandte Themen