2017-07-18 1 views
4

私は3つのオブザーバブルをチェーン化する必要があり、最初のものからの結果はもう一方のもので使用されます。前の1つが終了する。 ネストすることなくチェーンすることは可能ですか?3つのRxJS ObservablesがTypeScriptと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); 
} 

これは巣彼らにそれがこれを行うにはかのうではなく、私はそれらの鎖に見つけた唯一の方法ですが、彼らはまだネストされていますか?

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

はあなたがほとんど存在し

+2

チェーン 'co ncatMap'演算子については、https://stackoverflow.com/documentation/rxjs/8247/common-recipes/28035/sending-multiple-sequential-http-requests#t=201707180849217790878 – martin

答えて

2

は、あなただけの二ネストを削除する必要があなたの助けをありがとうございました、あなたは

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

concatMap呼び出しをチェーンすることができますし、「ドン場合最後に観測可能なものを生成するためにresult2が必要です。簡略化することができます

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

を参照してください。ただし、2番目の 'concatMap()'には'result1'へのアクセスはありますか? – rbarriuso

+0

Oups申し訳ありませんが、私はこの部分を逃しました、すぐに私の答えを更新します:) – atomrc

+1

良い、ありがとう!したがって、 'observable3'に' result1'と 'result2'の両方が必要な場合、' mapTo([result1、result2]) 'や' mapTo({res1:result1、res2:result2}) 'を使うことができますね。 – rbarriuso

関連する問題