путаница с onExceptionResumeNext, передавая наблюдаемое как лямбда-выражение - PullRequest
0 голосов
/ 29 мая 2018
io.reactivex.rxjava2:rxjava:2.1.13
kotlin_version = '1.2.30'

У меня есть следующая наблюдаемая, и я пытаюсь вызвать исключение, чтобы проверить захват исключения в OnError.Однако, когда я передаю следующее в onExceptionResumeNext(Observable.just(10)), я получаю следующий вывод:

1
2
10
onComplete

fun main(args: Array<String>) {
    Observable.fromArray(1, 2, 0, 4, 5, 6)
            .doOnNext {
                if (it == 0) {
                    throw RuntimeException("Exception on 0")
                }
            }
            .onExceptionResumeNext(Observable.just(10))
            .subscribe(
                    {
                        println(it)
                    },
                    {
                        println("onError ${it.message}")
                    },
                    {
                        println("onComplete")
                    } )
}

Однако, если я передаю лямбда-выражение этому методу, я получаю следующий вывод:

1
2

 Observable.fromArray(1, 2, 0, 4, 5, 6)
            .doOnNext {
                if (it == 0) {
                    throw RuntimeException("Exception on 0")
                }
            }
            .onExceptionResumeNext { Observable.just(10) }
            .subscribe(
                    {
                        println(it)
                    },
                    {
                        println("onError ${it.message}")
                    },
                    {
                        println("onComplete")
                    } )
}

Просто интересно, в чем разница между этим onExceptionResumeNext(Observable.just(10)) и этим onExceptionResumeNext { Observable.just(10) }

Большое спасибо заранее

1 Ответ

0 голосов
/ 29 мая 2018

в первом случае, когда вы передаете наблюдаемое на onExceptionResumeNext

, в случае ошибки в исходной наблюдаемой, вы будете повторно подписаны на наблюдаемое, которое передается на onExceptionResumeNext

, поэтомувы получаете «1» и «2» из исходного источника, а затем «10» и «onComplete» из Observable.just(10)

во втором случае вы используете лямбда-синтаксис, поэтому вы эффективно выполняетеэто:

.onExceptionResumeNext(object : ObservableSource {
    void subscribe(@NonNull Observer<? super T> observer) {
        Observable.just(10)
    }
})

, как вы можете видеть, переданный вам observer не подписан.Таким образом, ничего не выдается после «1» и «2» из исходного источника

, что вы должны сделать, это

.onExceptionResumeNext { observer ->
    Observable.just(10).subscribe(observer)
}
...