【问题标题】:How do I use the result of the outer observer in the inner observer of switchMapTo?如何在switchMapTo的内部观察者中使用外部观察者的结果?
【发布时间】:2020-09-10 18:27:43
【问题描述】:

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

【问题讨论】:

    标签: angular rxjs rxjs-observables


    【解决方案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 的简写,它切换为不关心外部可观察对象的静态可观察对象,而不是依赖于它的动态可观察对象,这就是 switchMap 的用途。

    类似的逻辑适用于所有具有To 变体的运算符,例如mapmapTo ...您通常想要简单的,To 变体是更特殊的情况。

    【讨论】:

    • 我已经尝试过 switchmap 但不幸的是它并没有完成这项工作。 switchMap 在您需要外部观察者触发内部观察者时起作用。但是,当内部观察者随后发出流时,它不起作用。在这种情况下 switchMap 将只返回内部流的第一个发射。我需要它从内部流中发射所有排放物。
    • 你误会了switchMap 文档:rxjs-dev.firebaseapp.com/api/operators/switchMap switchMap 一直订阅内部 observable 直到它完成或外部再次发出,此时它重新订阅内部。无论哪种方式,switchMapTo 实际上只是围绕switchMap 的便利包装......除了静态与动态部分之外,它们的功能是相同的
    • 如果您的示例有效,我会喜欢它,但我通过痛苦的反复试验发现,在您拥有的设置中,内部观察者永远无法触发 this.category$ 发出新值 除非外部观察者也发出一个值。内部观察者依赖于要评估的外部观察者。我希望它独立评估
    • 你说的没有道理。内部 observable 不会也不应该触发外部 observable。也许您应该添加更多代码和简单的英文描述来说明您要完成的工作,因为您似乎对某些 rxjs 概念感到困惑。如果我知道更多,我相信我可以帮助你解决任何问题。
    • 你可以在这里看到:github.com/ReactiveX/rxjs/blob/master/src/internal/operators/… ... switchMapTo 实际上只是作为switchMap 的包装实现...它们是相同的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2016-02-20
    相关资源
    最近更新 更多