2017-02-22 3 views
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; 
    }) 
    }); 

답변

1

forkJoin()와 결국 그들을 연결하는 것입니다

searchConfiguration$: Observable<SearchConfiguration> = this.http 
    .get(this._configURL) 
    .map((config) => config.json()) 
    .concatMap(configuration => { 
    var observables = configuration.advanced.map(advanced => { 
     return this.http.get(advanced.optionsModel.url) 
     .map((r: Response) => r.json().data); 
    }); 

    return Observable.forkJoin(observables, (...options) => { 
     configuration.options = options; 
     return configuration; 
    }); 
    }) 
+0

이것은 나에게 많은 도움이되고 예상대로 모든 고급 옵션을 얻고 있습니다. 문제는 내가 원하는 것입니다. '.map ((config) => config.json(). advanced)'는 객체 전체에 추가됩니다. – Tina333

+0

@ Tina333 아, 알겠습니다. 그러면 좀 더 복잡해집니다. 모든'this.http'가 완료 될 때까지 기다렸다가 그 결과로'configuration'을 업데이트하기 위해'forkJoin()'을 사용하고 있습니다. – martin

+0

고마워, 나는 그것을 해결할 수 있었다. 그래서 내가 설명했던 것처럼 각 URL을 기반으로 각 고급 객체에 각 옵션 배열을 추가하는 것이 내가 원하는 것을 잘못 설명하는 것이 었습니다 (전체 객체가 아니라). 나는 당신의 제안에'observables.'에 하나 더 concatMap()을 추가함으로써 그것을 할 수있었습니다. 질문에 수정 된 코드를 추가했습니다. – Tina333

관련 문제