RxJava 如何在链中的不同点以不同方式处理错误

RxJava how to handle errors differently at different points in a chain

我在 RxJava 中有一个 API 调用链,当一个调用失败时,我需要中止链并处理错误。但每次失败都需要以不同的方式处理。我试过这个:

netRequestOne()
    .onErrorResumeNext {
        handleErrorOne()
        Single.error(it)
    }
    .flatMap {
        netRequestTwo()
    }
    .onErrorResumeNext {
        handleErrorTwo()
        Single.error(it)
    }
    // more flatMaps with requests...
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(
        {
            // deal with success
        },
        {
            // no-op
        }
    )

但是如果请求抛出异常,所有后续 onErrorResumeNext() 都会被调用,而不仅仅是与该请求相关的那个。

您可以通过以下方式实现请求的行为:

val requestOne = Single.just("Response 1")
    //.doOnSuccess { throw RuntimeException("Fail second request") } // (1)
    .doOnError {
        println("handleErrorOne")
    }

val requestTwo = Single.just(10)
    //.doOnSuccess { throw RuntimeException("Fail second request") } // (2)
    .doOnError {
        println("handleErrorTwo")
    }

requestOne
    .flatMap { oneResult -> requestTwo.map { twoResult -> Pair(oneResult, twoResult) } }
    .doOnSuccess { responses: Pair<String, Int> ->
        println(responses)
    }
    .flatMap { Single.just("More flatMaps") }
    .subscribe({}, {})

您可以取消注释 (1) and/or (2) 以模拟第一个或第二个请求中的失败。如果两个请求都成功结束,则合并响应并进行其他处理。