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)
以模拟第一个或第二个请求中的失败。如果两个请求都成功结束,则合并响应并进行其他处理。
我在 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)
以模拟第一个或第二个请求中的失败。如果两个请求都成功结束,则合并响应并进行其他处理。