2017-12-11 15 views
0

일부 배열에 구성 배열이있는 타일 배열을 가져옵니다. 구성을 가진 구성 요소는 옵션 배열 (옵션 Object 포함) 또는 restURL을 가리키는 optionUrl 중 하나를 가질 수 있습니다. 구성 및 optionUrl이있는 각 타일에 해당 옵션을 추가하는 방법은 무엇입니까? flatMap 및 forkJoin을 시도했지만 optionsUrl에 대한 요청을 완료하지 않은 것처럼 보입니다. 나는 또한 성공없이 mergeMap을 시도했다.조건부로 루프 내포 관찰 가능 조건 내에서 관찰 할 수 있습니다.

아이디어를 얻는 방법에 대한 아이디어가 있으십니까?

여기 optionUrl으로 예를 타일 구조입니다 :

ngOnInit(){ 
this._myService.getAllTiles() 
    .subscribe((tiles: Tiles[]) => { 
     this.tiles = tiles 
    }) 
} 

내 서비스 :

getAllTiles(): Observable<any>{ 
    return this._http 
     .get(this._tilesUrl) 
     .map((result) => result.json().data) 
     .flatMap((tiles) => { 

      tiles.map((tile) => { 
       if (tile.configurations) { 
        return Observable.forkJoin(
         tile.configurations.map((config) => { 
          if(config.optionsUrl) { 
           console.log(config); 
            return this._http.get(config.optionsUrl) 
             .map((result) => { 
              let optionArray = []; 
              config['option'] = optionArray; 
              let jsonObj = result.json(); 
              let newOptions = jsonObj.data; 

              console.log(newOptions); 

              config['option'].push(newOptions); 
              return config; 
             }) 
          } else { 
           return Observable.of(config); 
          } 
         }) 
        ) 
       } else { 
        return Observable.of(tiles) 
       } 
      }); 
      return Observable.of(tiles); 
      }) 
      } 

답변

0

문제는 당신 flatMap 방법에 달려있다

{ 
    id: "superTile", 
    name: "Super Tile", 
    configurations: [ 
     { 
     param: "shopId", 
     optionsUrl: "rest/shops" 
     }, 
     { 
     param: "sortOrder", 
     option: [ 
     { 
      id: "Newest", 
      text: "PROD_YEAR-DESC" 
     }, 
     { 
      id: "Rank", 
      text: "RANKING-DESC" 
     }, 
     ] 
     } 
     ] 
    } 

여기 내 구성 요소입니다. 배열을 반복 할 때 js map을 사용하지만 map이 생성하는 반환 배열을 사용하고 있지 않습니다. 매번 Observable.of(tiles)을 flatMap으로 반환하므로 매번 값이 구독됩니다. 대신 tiles.map이 반환하는 배열을 반환해야합니다.

.flatMap((tiles) => { 
    let tilesObservables$ = tiles.map(// rest of map code); 

    return Observable.forkJoin(tilesObservables$); 
}); 
+0

감사합니다. 어떻게 든 도움이되었습니다. 당신이 말한 것처럼 포크에 합류 한 후에도 tile.configurations의 두 번째 맵에 문제가 발생했습니다. 조건을 충족시키지 못했을 때, 더블 타일 또는 이중 설정 항목을 반환했습니다. 일시적으로 옵션 요청을 타일 구성 요소로 옮겼습니다.이 기능은 매력처럼 작동하지만 여전히 forkJoin 솔루션에 대해 궁금합니다. – Tina333

+0

@ Tina333'double tile or double config items'이란 무엇을 의미합니까? 코드에서 optionsUrl 또는 구성을 기반으로 HTTP 요청을 반환하는 것처럼 보입니다. – LLai

+0

다음과 같은 배열을 반환합니다. 0 : {tileObj} 1 : {configObj}, {configObj} 2 : {optionsObj} configObj}, 3 : {tileObj} 4 : {configObj}, {configObj} 조건을 만족하는지 여부에 따라 보이는 것처럼 tileObj 또는 config 객체를 반환합니다. else 문에서 Observable.of (config)를 반환하면 스트림이 예상되는 곳에 undefined를 제공한다고 불평합니다. – Tina333