switchMapTo 之后 switchMapTo 的用法

Usage of switchMapTo after switchMapTo

预期行为:

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()使用?

或者有其他实现方式吗?

每当您呼叫 switchMapTo(x) 时,它都会在您订阅 很久之前 发生。 x 就在那里进行评估。想一想:如果我调用 foo(2 + 1),它会将 2 + 1 计算为 3,然后调用 foo(3)switchMapTo(this.searchService.getBoardFilteredTasks()) 也在做同样的事情。因此,如果对 this.searchService.getBoardFilteredTasks() 的调用中的某些内容正在寻找在可观察对象的其余部分为 运行 之前不会存在的状态,它将失败。

您可以通过使用普通的 switchMap 来修复它,这将推迟创建您要切换映射到的可观察对象,直到值实际到达:

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

通常,如果您调用函数并将其传递给 switchMapTomergeMapTo 等,您可能会犯错误。这些最好与静态可观察引用一起使用以避免混淆,