如何在switchMapTo的内部观察器中使用外部观察器的结果? ...因为这就是switchMapTo实际的工作方式内部观察者只初始化一次可以做我想做的事吗?

问题描述

我正在使用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实际上并不将结果从外部观察者返回给内部观察者。据我所知,内部流仅初始化一次,然后由外部观察者的每次新发射触发

.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 内部流,而不仅仅是原始流的重复。这可能吗?

解决方法

使用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变体的运算符,例如Tomap……您通常希望使用普通运算符,mapTo变体更特殊情况。