2017-12-11 25 views
0

タイルの配列を取得しています。その配列の一部には配列があります。設定を持つものは、オプションの配列(optionオブジェクトを含む)またはrestURLを指すoptionUrlのいずれかを持つ可能性があります。 これらのオプションを各タイルに追加するには、設定とoptionUrlがありますか? flatMapとforkJoinを試しましたが、optionsUrlのリクエストが完了しないようです。また、私はmergeMapを試してみました。ループでネストされたobservable内で条件付きでforkJoin observablesを呼び出す

どのようにすれば効果がありますか?ここで

はoptionUrlと例のタイル構造です:

{ 
    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" 
     }, 
     ] 
     } 
     ] 
    } 

ここに私のコンポーネントです:

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方法にあります。配列をループするのに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の2番目のマップに問題が発生しました。条件に合わないときは、ダブルタイルまたはダブルの設定項目を返していました。一時的にオプションのリクエストをタイルコンポーネントに移動しました。これはcharmのように機能しますが、私はまだforkJoinソリューションについて興味があります。 – Tina333

+0

@ Tina333 'ダブルタイルやダブル設定アイテム 'とはどういう意味ですか?コードがoptionsUrlまたは設定だけに基づいてHTTPリクエストを返すようです。 – LLai

+0

0:{tileObj} 1:{configObj}、{configObj} 2:{optionsObj}、{ configObj}、 3:{tileObj} 4:{configObj}、{configObj} 条件を満たすかどうかは、tileObjまたはconfigオブジェクトのいずれかを返します。私がreturn Observable.of(config)from else文を削除した場合、ストリームが予期されていたところでundefinedを指定していると文句を言います。 – Tina333