Несколько HTTP-вызовов с использованием RXJS внутри оператора pipe - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть 3 конечных точки API (кандидаты, вакансии и интервью).

{
    "candidates": [
        {
           "id": 1,
           "name": "Serj"
        },
        {
           "id": 2,
           "name": "Alex"
        },
      ],
    "vacancies": [
        {
           "id": 1,
           "title": "Java"
        },
        {
           "id": 2,
           "title": "JS"
        },
      ],
   "interviews": [
        {
           "id": 1,
           "candidateId": 1,
           "vacancyId": 2,
           "date": "2018-12-11"
        },
        {
           "id": 2,
           "candidateId": 2,
           "vacancyId": 1,
           "date": "2018-12-11"
        },
      ]
}

Сначала я получаю интервью по дате и получаю множество интервью.

const params = new HttpParams().set('date', '2018-12-11');
this.http.get('http://localhost:3000/interviews', {params}).pipe();

Итак как я subscribe() к выводу pipe() - я хочу получить массив интервью, где вместо "candidateId" и "vacancyId" будут реальные объекты candidate и vacancy, выбранные из соответствующих конечных точек.

Таким образом, результат (Interview[]) должен выглядеть следующим образом:

[
  {
    "id": 1,
    "candidate": {
      "id": 1,
      "name": "Serj"
    },
    "vacancy": {
      // vacancy instance
    },
    "date": "2018-12-11"
  },
  // second interview object
]

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 09 декабря 2018

Если я правильно понял, вы хотите, чтобы ваш ответ на собеседование отфильтровывался и содержал массив объектов только с полями candidId и vacancyId?

Если это так, вы можете использовать этот метод:

this.http.get('http://localhost:3000/interviews', {params})
  .pipe(
     flatMap(item => item),
     map(({ candidates, vacancies, interviews}) => 
        interviews.map(({ id, candidateId, vacancyId, date }) => ({ 
           id,
           candidate: candidates.filter(c => c.id === candidateId)[0], 
           vacancy: vacancies.filter(v => v.id === vacancyId)[0],
           date
        })
     )),
     reduce((acc, val) => [acc, val])  
  )
  .subscribe(response => console.log(response));

Создал Stackblitz Demo для вашей справки.

...