Использование switchMapTo после switchMapTo - PullRequest
1 голос
/ 26 февраля 2020

Ожидаемое поведение:

1) Получить все задачи из taskService.getAllTasks();

2) Передать результаты задач в filterService.addFilterableTasks();

3) Получить задачи из filterService.getFilteredTasks();

4) Передать результаты задач в searchService.addTasks();

5) Получить задачи из searchService.getBoardFilteredTasks().

this.taskService.getAllTasks().pipe(
          tap((allTasks: Task[]) => {
              this.filterService.addFilterableTasks(allTasks);
              console.log(allTasks) // (1)
          }),
          switchMapTo(this.filterService.getFilteredTasks()),
          tap((tasks: Task[]) => {
              this.searchService.addTasks(tasks);
              console.log(`passed ${tasks.length} tasks`) // (2)
          }),
          switchMapTo(this.searchService.getBoardFilteredTasks()) // (3)
).subscribe((tasks: Task[]) => {          
          /* get the result tasks and show them on a board */
})

Текущее поведение:

Без строки (3):

строка 1 => ожидаемый массив в консоли

строка 2 => правильное количество пройденных задач

Со строкой (3):

строка 1 и все дальнейшее не запускается. Ошибка говорит о том, что в searchService.getBoardFilteredTasks

нет вопросов:

Разрешено ли использовать один switchMapTo() за другим?

Или есть другой способ реализовать такое?

1 Ответ

2 голосов
/ 26 февраля 2020

Всякий раз, когда вы звоните switchMapTo(x), это происходит задолго до того, как вы подпишетесь. И x оценивается тут же. Подумайте об этом: если я позвоню foo(2 + 1), он оценит 2 + 1 до 3, затем позвонит foo(3). switchMapTo(this.searchService.getBoardFilteredTasks()) делает то же самое. Итак, если что-то внутри этого вызова к this.searchService.getBoardFilteredTasks() ищет состояние, которого не будет, пока не будет запущена остальная часть наблюдаемой, это может дать сбой.

Вы можете исправить это, используя обычный switchMap, который будет откладывать создание наблюдаемой, с которой вы переключаетесь, до фактического достижения значения:

switchMap(() => this.searchService.getBoardFilteredTasks())

Как правило, если вы вызываете функцию и передавая это switchMapTo, mergeMapTo, et c, вы, вероятно, делаете ошибку. Их лучше всего использовать с stati c наблюдаемыми ссылками, чтобы избежать путаницы ,

...