この質問はすでに質問されています here 。ただし、質問者のアプリケーションコンテキストは質問に深く関わっているため、基本を理解できませんでした。たとえば、queryArr
パラメーターがあります。それは何をするためのものか?
とにかく、同期HTTP呼び出しを最も簡単な方法で行う方法について、少しのガイダンスが必要です。私が思いついた解決策は、「ネストされた」順序でオブザーバブルにサブスクライブする必要があるということです。たとえば、オブザーバブルox
とoy
があります。 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
はもう見た。私が間違っている場合は、私を修正し、正しい方向に向けてください。
この種のことを行うための「良い」解決策やより良い方法はありますか?
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];
});
}