web-dev-qa-db-ja.com

angular 2で同期HTTP呼び出しを行う方法

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

とにかく、同期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はもう見た。私が間違っている場合は、私を修正し、正しい方向に向けてください。

この種のことを行うための「良い」解決策やより良い方法はありますか?

10
Bora

flatMap演算子を見て、HTTP要求を実行し、その応答を待って別の要求を実行できると思います。

サンプルを次に示します。

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
  });
}

subscribeメソッドの両方の結果にアクセスしたい場合は、Observable.forkJoinおよびObservable.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 => {
    // results is an array of the results of all requests
    let result1 = results[0];
    let result2 = results[1];
  });
}
9