我正在使用switchMapTo
创建由外部观察者触发的内部流。
// a change in value of categoryId triggers the inner observer to reinitialize
this.category$ = this.categoryId$.pipe(
switchMapTo((newCategoryId) =>
// inner stream is reinitialized using result from outer stream
this.categoriesQuery.selectEntity(newCategoryId)
)
)
.switchMapTo
实际上并不将结果从外部观察者返回给内部观察者。据我所知,内部流仅初始化一次,然后由外部观察者的每次新发射触发
.switchMapTo
的实际工作方式:
this.category$ = this.categoryId$.pipe(
switchMapTo(
this.categoriesQuery.selectEntity(newCategoryId) // <= where does newCategoryId come from now?
)
)
不幸的是,这也不起作用:
this.category$ = this.categoryId$.pipe(
tap((newValue) => {
this.currentCategoryId = newValue
}),
switchMapTo(() =>{
this.categoriesQuery.selectEntity(this.currentCategoryId)
}
)
)
因为内部观察者仅初始化一次(而不是在外部观察者的每次发射中初始化),因此this.currentCategoryId
的值在第一次评估时就被硬编码。
我很困。我想产生switchMapTo
的效果,即外部观察者触发新的内部流的发射。但这需要是一种 new 内部流,而不仅仅是原始流的重复。这可能吗?
答案 0 :(得分:1)
使用switchMap
,而不是switchMapTo
...
this.category$ = this.categoryId$.pipe(
switchMap((newCategoryId) =>
// inner stream is reinitialized using result from outer stream
this.categoriesQuery.selectEntity(newCategoryId)
)
)
switchMapTo
本质上是switchMap
的简写,它转换成一个静态的可观察对象,而不关心外部的可观察对象,而不是依赖于它的动态对象,这就是{{1} }。
类似的逻辑适用于所有带有switchMap
变体的运算符,例如To
和map
……您通常希望使用普通运算符,mapTo
变体更特殊情况。