2017-06-16 4 views
0

Ich habe eine ziemlich klobig von Code festgelegt, wo die Daten von einer beobachtbaren in eine anderen ernähren werden, wie solche:Rxjs Eine beobachtbare Fütterung in einer anderen

let source = this.myService.getFoo() 
    .subscribe(result => { 
     let source2 = this.myService.getMoo(result) 
     .subscribe(result2 => { // do stuff }); 
    }); 

Ich weiß, dass es Wege gibt, und die Kette zu kombinieren, aber Ich brauche Daten von der Quelle, um in Quelle2 eingegeben zu werden. Die Verschachtelung von Abonnenten sieht schrecklich aus und ich bin ziemlich sicher, dass es einen besseren Weg gibt, dies zu tun.

Danke!

Antwort

2

Zum Umwandeln von Objekten, die von einem Observable in ein anderes Observable ausgegeben werden, möchten Sie wahrscheinlich den Operator flatMap verwenden. Es erzeugt ein inneres Observable und flacht sein Ergebnis zum äußeren Strom ab.

let source = this.myService.getFoo() 
    .flatMap(result => this.myService.getMoo(result)) 
    .subscribe(result2 => { // do stuff }); 

Hier sind einige flache Operatoren, die Sie, dass sich anders verhalten können:

  • flatMap/mergeMap - ein beobachtbares sofort für jede Quelle Artikel erstellt, werden alle vorherigen Observable am Leben gehalten
  • concatMap - wartet auf das vorherige innere Observable, bevor das nächste erstellt wird
  • sw itchMap - für jedes Quellelement, vervollständigt die vorherige innere beobachtbar und sofort schafft die nächsten
  • exhaustMap - Quellelemente ignoriert werden, während die vorherige innere beobachtbare nicht
+0

Danke für die Info abgeschlossen ist. Das hat den Trick gemacht! –

1

Sie können merge verwenden, um „merge“, um die beiden Ströme so jegliche Emission von jeder der beiden Observablen Beobachtern gesendet wird:

let source = this.myService.getFoo() 
    .merge(this.myService.getMoo(result)) 
    .subscribe(...); 

... oder wenn Sie auf die zweite beobachtbare abonnieren möchten nachdem der erste Wert emittiert wird, kann man mergeMapTo verwenden:

let source = this.myService.getFoo() 
    .mergeMapTo(this.myService.getMoo(result)) 
    .subscribe(...); 

Sie können mit concatMap eine ähnliche Sache zu tun, die bis in die inneren beobachtbare compeletes warten.

Es hängt jedoch wirklich davon ab, was Sie erreichen möchten und was Sie bei Ihren Beobachtern erhalten möchten.

Verwandte Themen