複数のオブザーバブルに変換したい複数のオブジェクトを返すHTTPGETリクエストがあります。応答の例を次に示します。
{
lookup1:
[
{
"label": "lookup1 option 1",
"value": 1
},
{
"label": "lookup1 option 2",
"value": 2
}
],
lookup2:
[
{
"label": "lookup2 option 1",
"value": 1
},
{
"label": "lookup2 option 2",
"value": 2
}
]
}
これが2つのオブザーバブルを取得する私のサービスです:
this.lookup1 = this.apiService.get('/lookups/')
.pipe(map(response => response["lookup1"]));
this.lookup2 = this.apiService.get('/lookups/')
.pipe(map(response => response["lookup2"]));
1つのHTTPGETリクエストでこれを行うにはどうすればよいですか?
このようなコードは2つのHTTPGETリクエストを実行することに注意してください。
let lookups = this.apiService.get('/lookups/');
this.lookup1 = lookups
.pipe(map(response => response["lookup1"]));
this.lookup2 = lookups
.pipe(map(response => response["lookup2"]));
方法1
リクエストが解決すると更新される2つのサブジェクトを作成します。
let map1 = new Subject();
let map2 = new Subject();
this.lookup1 = map1.pipe(map(response => response["lookup1"]));
this.lookup2 = map2.pipe(map(response => response["lookup2"]));
this.apiService.get('/lookups/').subscribe( response => {
map1.next(response);
map2.next(response);
})
方法2
concatMap
とfrom
を使用して、ストリームを別のストリームに変換できます。
this.apiService.get('/lookups/').pipe(
concatMap( responseJson => from(Object.values(responseJson)))
).subscribe( arrayElement=> console.log(arrayElement))
出力:
// first object emitted :
[
{
"label": "lookup1 option 1",
"value": 1
},
{
"label": "lookup1 option 2",
"value": 2
}
]
// second object emitted :
[
{
"label": "lookup2 option 1",
"value": 1
},
{
"label": "lookup2 option 2",
"value": 2
}
]
concatMap Observableを取得し、別のObservableを発行します。
from反復可能な要素をストリームに変換します。 iterableのアイテムと同じ量の排出量が得られます。