2
3 개의 다른 REST 끝점에서 데이터를 가져 오려고합니다. 데이터 모델은 주요 데이터로 구성되어 있으며 2 (향후 더 많을 수 있음) 개체로 고급 배열이 있습니다. 각 배열에 지정된 REST 끝점을 기반으로 각 고급 개체에 옵션이있는 배열을 삽입하려고합니다. 모든 것이 작동하고 Observable에서 Object로 반환됩니다. 추가 옵션을 제외하고 Observables로 제공됩니다.관찰 대상에서 다른 관측 가능 부분으로 객체 반환
단순화 된 데이터 :, 내 데이터 모델에서
{
data: [
{
name: "DR1",
id: 1
},
{
name: "DR2",
id: 1
},
...
]
}
I 옵션 [] 배열을 가지고 있지 않습니다
{
simple: {
param: "searchQuery",
},
advanced: [
{
param: "food",
optionsModel: {
url: "http://address.com/food",
}
},
{
param: "drinks",
optionsModel: {
url: "http://address.com/drinks",
}
}
]
}
음식과 음료 같은 구조가 이름과 ID로 객체로 구성된이 그래서 나는 그것을 수동으로 주입했다. 서비스 :
searchConfiguration$: Observable<SearchConfiguration> = this.http
.get(this._configURL)
.map((config) => {
let configuration = config.json();
let advancedArray = configuration.advanced;
if(advancedArray) {
advancedArray.forEach(advanced => {
advanced.options = [];
advanced.options = this.http.get(advanced.optionsModel.url)
.map((r: Response) => r.json().data
})
}
return configuration;
})
부모 요소 :
getSearchConfig() {
this.searchConfiguration$ = this._bundlesService.searchConfiguration$;
}
그런 다음 내가 관찰 가능한에 가입 할 수있는 HTML에서 비동기 파이프를 가지고있다. 내 옵션을 고급이 아닌 실제 배열로 추가하려면 어떻게해야합니까?
편집 - 솔루션
감사 마틴의 대답에,이 솔루션은 스트림을 모두 평평하고 나는 그것을하지만 테스트를하지 않았다
searchConfiguration$: Observable<SearchConfiguration> = this.http
.get(this._configURL)
.map((config) => config.json())
.concatMap((configuration) => {
let observables = configuration.advanced.map((advanced) => {
return this.http.get(advanced.optionsModel.url)
.map((r: Response) => r.json().data)
.concatMap((options) => advanced.options = options)
});
return Observable.forkJoin(observables, (...options) => {
return configuration;
})
});
이것은 나에게 많은 도움이되고 예상대로 모든 고급 옵션을 얻고 있습니다. 문제는 내가 원하는 것입니다. '.map ((config) => config.json(). advanced)'는 객체 전체에 추가됩니다. – Tina333
@ Tina333 아, 알겠습니다. 그러면 좀 더 복잡해집니다. 모든'this.http'가 완료 될 때까지 기다렸다가 그 결과로'configuration'을 업데이트하기 위해'forkJoin()'을 사용하고 있습니다. – martin
고마워, 나는 그것을 해결할 수 있었다. 그래서 내가 설명했던 것처럼 각 URL을 기반으로 각 고급 객체에 각 옵션 배열을 추가하는 것이 내가 원하는 것을 잘못 설명하는 것이 었습니다 (전체 객체가 아니라). 나는 당신의 제안에'observables.'에 하나 더 concatMap()을 추가함으로써 그것을 할 수있었습니다. 질문에 수정 된 코드를 추가했습니다. – Tina333