2017-02-22 20 views
2

3つの異なるREST終点からデータを取得しようとしました。データモデルは主データで構成されており、2つのオブジェクト(将来的にはより多くのオブジェクトがあります)を持つ高度な配列を持ちます。私は、それぞれに指定されたRESTエンドポイントに基づいて、高度なオブジェクトのそれぞれにオプションを持つ配列を挿入したいと考えています。すべてが機能し、オブジェクトとしてObservableから返されます。Observablesとして追加されるオプションは例外です。オブジェクトを別の観測対象の中に観測可能から返す

簡易データ:

{ 
simple: { 
    param: "searchQuery", 
}, 
advanced: [ 
    { 
    param: "food", 
    optionsModel: { 
    url: "http://address.com/food",  
    } 
    }, 
    { 
    param: "drinks", 
    optionsModel: { 
    url: "http://address.com/drinks", 
    } 
    } 
    ] 
} 

食べ物や飲み物は、名前とIDとオブジェクトから成る同じ構造を有する:私のデータモデルでは

{ 
    data: [ 
    { 
    name: "DR1", 
    id: 1 
    }, 
    { 
    name: "DR2", 
    id: 1 
    }, 
    ... 
    ] 
} 

を私はオプション[]配列を持っていません、私はそれを手動で注入します。サービス:

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

これは私に多くの助けとなります。私は予想通りにすべての高度なオプションを手に入れています。問題は私がgにしたいことです'.map((config)=> config.json()。advanced)'は直接オブジェクトに追加されます。 – Tina333

+0

@ Tina333ああ、そうだ。その後、少し複雑になります。私は 'すべての' this.httpが完了するまで待つために 'forkJoin()'を使い、 'configuration'をその結果で更新します。 – martin

+0

ありがとう、私はそれを解決するために管理しました。だから私が望んだことを間違って説明していた - 各URLに基​​づいて各高度なオブジェクトに各オプションの配列を追加することができた(私が説明したように、オブジェクト全体ではない)。私はあなたの提案に 'observables.'にもう一つconcatMap()を追加することでそれを実現しました。私はその質問に変更されたコードを追加しました。 – Tina333

関連する問題