2017-06-22 6 views
1

Ich kann viele Beispiele mit der Verkettung von zwei Anrufen finden, aber ich habe 3 http Anrufe, um nacheinander Daten aus dem vorherigen Anruf zu machen.Angular 2 kombinieren drei http Aufrufe mit FlatMap? RxJs?

Ich habe zwei Arbeits flatMap mit

so:

call1(params) 
    .flatMap((res1)=> { 
    return call2(params) 
     .subscribe(r=>r...) 

Aber für drei Anrufe ich die gleiche Sache bin versucht, aber ich glaube nicht, Sie können Kette flatMaps zusammen?

call1(params) 
    .flatMap((res1)=> { 
    return call2(params) 
     .flatMap((res2)=> { 
      return call3(params) 
       .subscribe(r=>r...) 

Ich bekomme einen Fehler, der besagt, dass die Subskription nicht dem Beobachtungseingangstyp zugewiesen werden kann. Jeder dieser Aufrufe1 gibt eine Observable aus einer http-Operation zurück.

Kann mir jemand in die richtige Richtung zeigen?

Würde ich wirklich schätzen, da es mich verrückt macht!

dank Paul

+1

Sie binden Sie das Ergebnis auf eine Variable mit Typ 'Observable'? – Dinistro

+0

Können Sie Ihren vollständigen Code kopieren und einfügen? –

+0

nvm, fand das Problem – Dinistro

Antwort

7

Sie können flatMap so oft nutzen, wie Sie möchten. Sie müssen jedoch jedes Mal ein Observable zurückgeben. Zum Beispiel

myFunc() // returns an Observable of type X 
     .flatMap((res: X) => { 
      // returns an Observable of type Y 
     }) 
     .flatMap((res: Y) => { 
      // returns an Observable of type Z 
     }) 
     .flatMap((res: Z) => { 
      // returns an Observable of type Q 
     }) 
     .subscribe((res: Q) => { 
      // some logic 
     }); 
3

flatMap() erwartet eine Observable als Rückgabewert, aber Sie geben ein Subscription.

Fix es wie folgt aus:

call1(params) 
    .flatMap((res1)=> { 
     return call2(params); 
    }) 
    .flatMap((res2)=> { 
     return call3(params); 
    }) 
    .subscribe(r=>r...) 

Zusätzliche Anmerkung:

Diese Anfrage wird noch hintereinander ausgeführt werden, nicht parallel. Wenn Sie dies beschleunigen möchten, können Sie Observable.forkJoin() verwenden:

Observable.forkJoin(
    call1(params), 
    call2(params), 
    call3(params) 
).subscribe((responses) => { 
    // responses[0] -> response of call1 
    // responses[1] -> response of call2 
    // responses[2] -> response of call3 
}) 
+0

danke, das ist super. Ich kann in diesem Fall nicht gabelJoin verwenden, da die Anrufe alle voneinander abhängig sind ... – paulinventome