1

预期行为:

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()接一个地使用?

还是有另一种实现方式?

4

1 回答 1

2

每当您打电话switchMapTo(x)时,它都会在您订阅之前很久。x在那里进行评估。想一想:如果我打电话,它会foo(2 + 1)评估然后打电话。正在做同样的事情。因此,如果此调用中的某些内容正在寻找在其余 observable 运行之前不会存在的状态,那么它将失败。2 + 13foo(3)switchMapTo(this.searchService.getBoardFilteredTasks())this.searchService.getBoardFilteredTasks()

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

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

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

于 2020-02-26T16:01:37.420 回答