2016-08-10 8 views
6

この質問は既に質問されていますhere。しかし、質問者のアプリケーションのコンテキストはあまりにも多くの質問に関わっているので、私は基本を理解できませんでした。たとえば、queryArrパラメータがあります。それは何をするためのものか?角2で同期httpコールを作成する方法

とにかく、シンプルな方法で同期httpコールを作成する方法について、ちょっとした指導が必要です。私が思いついた解決策は、オブザーバブルを「入れ子にした」順序で購読しなければならないということです。たとえば、観測値oxoyがあります。 oyに呼び出されるリクエストのデータは、データに依存しているoxから来ている:

xData: string = ""; 
yData: string = ""; 

ox.subscribe(
    data => {xData = data;}, 
    error => console.log(error), 
    () => { 
     oy.subscribe(
      data => {yData = xData*data;}, 
      error => console.log(error), 
      () => console.log("aaa") 
     ); 
    } 
); 

私が覚えている最後の時間(私はjavascriptのに多くの操作を行い、少し初心者ですしていない)、私は加入範囲内oyに、xDataまたはyDataはもう見られません。私が間違っている場合は、私を修正して正しい方向に向かわせてください。

このようなことを行うには「良い」解決策がありますか?

答えて

5

私は、flatMapオペレータを見て、HTTPリクエストを実行し、そのレスポンスを待って別のリクエストを実行すると思います。ここで

はサンプルです:あなたは subscribe方法で両方の結果へのアクセス権を持っているしたい場合は

executeHttp(url) { 
    return this.http.get(url).map(res => res.json()); 
} 

executeRequests() { 
    this.executeHttp('http://...').flatMap(result => { 
    // result is the result of the first request 
    return this.executeHttp('http://...'); 
    }).subscribe(result => { 
    // result is the result of the second request 
    }); 
} 

、あなたが活用できObservable.forkJoinObservable.of:これは、複数のチェーン作っているように見える

executeRequests() { 
    this.executeHttp('http://...').flatMap(result => { 
    // result is the result of the first request 
    return Observable.forkJoin([ 
     Observable.of(result), 
     this.executeHttp('http://...'); 
    }).subscribe(results => { 
    // result is the result of both requests 
    let result1 = results[0]; 
    let result2 = results[1]; 
    }); 
} 
+5

httpリクエストを送信することができますが、質問はシンプルで同期HTTPリクエストを作成する方法でした。 – Neutrino

+0

httpリクエストは同期しないので、適切なソフトウェア設計(Observable based)が必要であり、前述の[Observable.forkJoin](https://www.learnrxjs.io/operators/combination/forkjoin)を見てください。 .html)演算子を使用して、http呼び出しを並列化し、すべてが終了したらサブスクリプションを取得します。 – Markus

関連する問題