2017-02-22 53 views
2

Я пытаюсь получить данные из трех разных конечных точек 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; 
    }) 
    }); 

ответ

1

Я не проверял, но я думаю, вы могли бы что-то сделать следующим образом:

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

это очень помогает, и я получаю все расширенные параметры, как ожидалось, проблема в том, что я хотел бы et them добавлены ко всему объекту - где '.map ((config) => config.json(). advanced)' отображается непосредственно на продвинутый. – Tina333

+0

@ Tina333 А, я вижу. Тогда это становится немного сложнее. Я использую 'forkJoin()', чтобы подождать, пока все 'this.http' будут завершены, а затем обновит' configuration' с их результатом. – martin

+0

Большое спасибо, мне удалось это решить. Поэтому я объяснял неправильно, что я хотел - добавлять каждый параметр Array к каждому расширенному объекту, основываясь на каждом URL-адресе (а не на целом объекте, как я объяснил). Мне удалось это сделать, добавив еще одно concatMap() на 'observables.' к вашему предложению. Я добавил модифицированный код в вопрос. – Tina333

 Смежные вопросы

  • Нет связанных вопросов^_^