Я пытаюсь получить данные из трех разных конечных точек REST. Модель данных состоит из основных данных и имеет расширенный массив с 2 (может быть больше в будущем) Объектами. Я хочу ввести массив с параметрами в каждый из продвинутых объектов на основе конечной точки REST, указанной в каждом из них. Все работает и возвращается из Observable as Object, за исключением добавленных опций, которые являются Observables.Возвращаемый объект из наблюдаемого внутри другого наблюдаемого
Упрощенная данные:
{
simple: {
param: "searchQuery",
},
advanced: [
{
param: "food",
optionsModel: {
url: "http://address.com/food",
}
},
{
param: "drinks",
optionsModel: {
url: "http://address.com/drinks",
}
}
]
}
еда и напитки имеют такую же структуру, состоящую из объектов с именем и идентификатором:
{
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, чтобы подписаться на Observable. Как я могу добавить мои параметры в расширенные как реальные массивы, а не как поток?
Edit - Решение
Благодаря ответ Мартина, решение выравниваться оба потока и соединить их в конце концов, с forkJoin()
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;
})
});
это очень помогает, и я получаю все расширенные параметры, как ожидалось, проблема в том, что я хотел бы et them добавлены ко всему объекту - где '.map ((config) => config.json(). advanced)' отображается непосредственно на продвинутый. – Tina333
@ Tina333 А, я вижу. Тогда это становится немного сложнее. Я использую 'forkJoin()', чтобы подождать, пока все 'this.http' будут завершены, а затем обновит' configuration' с их результатом. – martin
Большое спасибо, мне удалось это решить. Поэтому я объяснял неправильно, что я хотел - добавлять каждый параметр Array к каждому расширенному объекту, основываясь на каждом URL-адресе (а не на целом объекте, как я объяснил). Мне удалось это сделать, добавив еще одно concatMap() на 'observables.' к вашему предложению. Я добавил модифицированный код в вопрос. – Tina333