Объедините 3 потока с наблюдаемыми последовательно и параллельно - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь объединить 3 HTTP-запроса в 1 ответ.

Последние 2 запроса зависят от данных из первого запроса.Я выбрал следующий подход, используя flatMap и forkJoin после прочтения этого поста .

Автор использует более старую версию Angular и RXjs, поэтому я изменил ее, чтобы использовать конвейерные операторы,Но я все еще не могу получить ответ, который мне нужен.

  public getAllData(params): Observable<any> {
    return this.http.get<any>(`${this.base}/seasons.json`, {params: params})
    .pipe(
      map((data: SeasonBase) => data.MRData.SeasonTable.Seasons),
      flatMap((seasons: Season[]) => {
        if(seasons.length > 0) {
          return forkJoin(
            of(seasons),
            seasons.map((season: Season) => {
              return this.http.get(`${this.base}/${season.season}/results/1.json`)
                .pipe(
                  map((data: RaceBase) => data.MRData.RaceTable)
                )
            }),
            seasons.map((season: Season) => {
              return this.http.get(`${this.base}/${season.season}/driverStandings.json`)
                .pipe(
                  map((d: any) => d.MRData.StandingsTable.StandingsLists[0])
                )
            })
          ).pipe(
            map((data: any) => {
              let season = data[0];
              let races = data[1];
              let standings = data[2];
              season.testRaces = races;
              season.standings = standings;
              return season;
            })
          )
        }
      }),
      catchError(this.handleError)
    )
  }

Вышеуказанный метод возвращает следующий ответ при подписке:

enter image description here

Ответ, который я пытаюсь получить, должен быть примерно таким:

{
  season: "1950", 
  url: "http://en.wikipedia.org/wiki/1950_Formula_One_season",
  testRaces: [test_races_data], // dont want observable
  standings: [standings_data] // dont want observable
},
{...},
{...}
etc

testRaces и standings возвращаются как Наблюдаемые вместо ответов.

Можно ли "развернуть" 2 Obseravbles перед возвратом ответа, чтобы я мог отобразить данные?

Вот блик стека кода, как это в настоящее время написано.Вы можете проверить консоль dev tools, чтобы увидеть ответ.

Ответы [ 2 ]

0 голосов
/ 07 июня 2018
seasons.map((season: Season) => {
          return this.http.get(`${this.base}/${season.season}/results/1.json`)

Создает наблюдаемую из наблюдаемых.Используйте flatMap вместо map, тогда вы получите наблюдаемое, которое испускает значение.

0 голосов
/ 07 июня 2018

В вашем классе ErgastService строки 24 и 30 возвращают массив наблюдаемых вместо их содержимого.

Быстрое решение состоит в том, чтобы добавить два forkJoin, как я в этой разветвленной версии https://stackblitz.com/edit/angular-l3wkmw?file=src/app/api.service.ts

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...