2017-07-18 3 views
4

Ich habe 3 Observablen, die ich ketten muss, Ergebnis von erstem wird in den anderen 2 verwendet. Sie müssen in Reihenfolge laufen und jeder muss warten für den vorherigen zu beenden. Ist es möglich, dann zu verketten ohne zu verschachteln?Verketten und Zusammenführen 3 RxJS Observables mit Ergebnisabhängigkeiten ohne Verschachtelung in TypeScript und Angular 4

public observable1(): Observable<Response> { 
    let headers = new Headers(); 
    headers.append("Content-Range", "bytes */*"); 
    let requestOptions = new RequestOptions({headers: headers}); 
    return this.http.put(url, "", requestOptions); 
} 

public observable2(data1url): Observable<Response> { 
    let headers = new Headers(); 
    headers.append("Content-Range", "bytes */*"); 
    let requestOptions = new RequestOptions({headers: headers}); 
    return this.http.put(data1url, "", requestOptions); 
} 

public observable3(data1url): Observable<Response> { 
    let headers = new Headers(); 
    headers.append("Content-Range", "bytes */*"); 
    let requestOptions = new RequestOptions({headers: headers}); 
    return this.http.put(data1url, "", requestOptions); 
} 

Dies ist die einzige Art, wie ich zu verketten sie gefunden, aber sie immer noch verschachtelt sind, ist es posible sich diese und nicht zu Nest zu tun?

public doHttpProcess() { 
    return this.observable1().concatMap(result1 => { 
     return this.observable2(result1.json().data1) 
      .concatMap(result2 => { 
       return this.observable3(result1.json().data1); 
      }); 
    }); 
} 

Vielen Dank für Ihre Hilfe

+2

Kette 'co vereinfachen ncatMap' Operatoren, siehe https://stackoverflow.com/documentation/rxjs/8247/common-recipes/28035/sending-multiple-sequential-http-requests#t=201707180849217790878 – martin

Antwort

2

Sie sind fast da, man muss nur die zweite Verschachtelung entfernen und Sie können Kette die concatMap Anrufe

public doHttpProcess() { 
    return this.observable1() 
     .concatMap(result1 => this.observable2(result1.json().data1).map(result2 => ({ result1, result2 })) 
     .concatMap(({ result1, result2 }) => this.observable3(result1.json().data1)); 
} 

Und wenn Sie don‘ t brauchen result2, um das letzte beobachtbare zu erzeugen, können Sie zu

public doHttpProcess() { 
    return this.observable1() 
     .concatMap(result1 => this.observable2(result1.json().data1).mapTo(result1)) 
     .concatMap(result1 => this.observable3(result1.json().data1)); 
} 
+0

Aber in der zweiten 'concatMap()' gibt es keine Zugang zu 'result1', oder? – rbarriuso

+0

Oups sorry, ich habe diesen Teil verpasst, wird meine Antwort sofort update :) – atomrc

+1

Klingt gut, danke !. Wenn "observable3" sowohl 'result1' als auch' result2' benötigt, könnte man 'mapTo ([result1, result2])' oder 'mapTo ({res1: result1, res2: result2})' verwenden, oder? – rbarriuso

Verwandte Themen