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())
通常,如果您调用函数并将其传递给 switchMapTo
、mergeMapTo
等,您可能会犯错误。这些最好与静态可观察引用一起使用以避免混淆,
预期行为:
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())
通常,如果您调用函数并将其传递给 switchMapTo
、mergeMapTo
等,您可能会犯错误。这些最好与静态可观察引用一起使用以避免混淆,