首页 > 解决方案 > rxjava - SwitchMap - 为什么它不返回整数流中最近的 observable?

问题描述

我已经编写了简单的代码进行测试。我创建了一个整数流,并应用了一个开关图。 从我在整个教程中在线找到的文档中

另一方面,SwithMap() 是与 FlatMap 和 ConcatMap 完全不同的运算符。SwitchMap 总是返回最新的 Observable 并从中发出项目。

 Observable.fromIterable(mutableListOf(1,2,3,4,5,6))
 .switchMap { x-> Observable.just(x)}
 .subscribe{ Timber.d {"my result $it" }}

我期望结果只有一个值。我不知道 switch Map 是否像 concatMap 一样是连续的,但我只期望一个值。

所以我期待这样的结果:

相反,这是我得到的结果:

为什么不只返回最近的一个并丢弃整数流中的其他 observables 呢?那么 switchMap 的目的是什么?

更新:在 switchMap 添加延迟后,它会产生预期的结果。但我不清楚为什么:

  Observable.fromIterable(mutableListOf(1,2,3,4,5,6))
                .switchMap { x-> Observable.just(x).delay(1, TimeUnit.SECONDS);}
                .subscribe{ Timber.d {"my result $it" }}

现在我得到了预期的结果:

可以帮助解释为什么我需要延迟。我尝试了以下方法,但没有延迟:

 Observable.fromIterable(mutableListOf(1,2,3,4,5,6))
            .switchMap { x-> Observable.just(x)}
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe{ Timber.d {"my result $it" }}

我认为关于 switch map 的规则应该是: SwitchMap 在特定延迟后只会发出最新的 observable。它忽略了所有以前的。在从提要中检索最新数据时,它很有用。当您需要在许多提要中识别最新的时,它很有用。

我能得到一些确认这是正确的吗?

标签: rx-java2

解决方案


推荐阅读