rxjava - SwitchMap - почему он не возвращает самые последние наблюдаемые в целочисленном потоке? - PullRequest
0 голосов
/ 08 ноября 2018

Я написал простой код теста. Я создал поток интергеров и применил карту переключателей. из документов, которые я нашел в Интернете в учебниках на протяжении :

SwithMap (), с другой стороны, полностью отличается от оператора FlatMap и ConcatMap. SwitchMap всегда возвращает последнюю наблюдаемую и испускает предметы из него.

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

Я ожидал, что результат только одно значение. я не знаю, является ли переключатель Map последовательным, как concatMap, но я ожидал только одно значение.

так что я ожидал такого результата:

  • мой результат 6

Вместо этого я получил результат:

  • мой результат 1 мой результат 2 мой результат 3 мой результат 4 мой результат 5 мой результат 6 * * тысяча двадцать-один

почему не вернули только самую последнюю и не отбросили другие наблюдаемые в потоке целых чисел? Какова цель 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" }}

теперь я получаю ожидаемые результаты:

  • мой результат 6

может помочь объяснить, почему мне нужна задержка. я попробовал следующее, но это не сработало без задержки:

 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" }}

Я думаю, что правило о карте переключателей должно быть таким: SwitchMap будет излучать только последние наблюдаемые после определенной задержки. Он игнорирует все предыдущие. Это полезно, когда дело доходит до получения последних данных из канала. Это полезно, когда вам нужно определить последние из многих каналов.

Могу ли я получить подтверждение, что это правильно?

...