Уведомить о завершении последовательности наблюдаемых - PullRequest
0 голосов
/ 11 декабря 2018

Я пытаюсь использовать RxJS Observables для фильтрации списка объектов на основе выбора пользователей.Чтобы получить список отфильтрованных объектов, мне нужно последовательно вызвать три отдельных сервиса и передать значения из предыдущего сервиса в следующий сервис.

ПРИМЕЧАНИЕ 1: Каждая из этих трех служб возвращает Observable

ПРИМЕЧАНИЕ 2: Каждая служба может возвращать произвольное количество результатов, каждое из которых необходимочтобы перейти к следующему сервису.

Мой код может продолжить нормально работать только после того, как третий сервис завершит отправку всех своих значений.

Вот что у меня сейчас:

this.firstService.getFirstResults(filterOption)
            .subscribe(firstResult => this.secondService.getSecondResults(firstResult)
                .subscribe(secondResult => this.thirdService.getThirdResults(secondResult)
                    .subscribe(thirdResult => this.processResult(thirdResult, firstResult),
                    null,
                    () => console.log("COMPLETE")))
            );

Приведенный выше код работает для меня почти идеально.В конце концов, функция processResult() правильно создает массив со всеми отфильтрованными объектами.

Однако я не знаю, как получить уведомление, когда последовательность Observables действительно завершена.Я надеялся, что секция complete третьего сервиса выполнит эту работу, но она печатает на консоль несколько раз, а не один раз.

ПРИМЕЧАНИЕ 3: В финалевызов processResult() Мне нужно передать как значение 3rdResult, так и соответствующее значение firstResult, возвращаемое из firstService.getFirstResults().

1 Ответ

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

switchMap предоставил второй параметр для реструктуризации возвращаемого значения, ниже приведена демонстрационная демонстрация того, как это сделать.

function getResult(filterOption) {
  return this.firstService.getFirstResult(filterOption).pipe(
    switchMap(
      firstResult => this.secondeService.getSecondResult(firstResult),
      ([firstResult, secondResult]) => ({ firstResult, secondResult }),
    ),
    switchMap(
      ({ secondResult }) => this.thirdService.getThirdResult(secondResult),
      ([{ firstResult }, thirdResult]) => ({ firstResult, thirdResult }),
    ),
  );
}

getResult(filterOption).subscribe({
  next: ({ firstResult, thirdResult }) => this.processResult(thirdResult, firstResult),
  completed: () => console.log('completed'),
});
...