gpt4 book ai didi

error-handling - RxAndroid-使用Zip运算符处理错误

转载 作者:行者123 更新时间:2023-12-02 13:04:23 28 4
gpt4 key购买 nike

我正在尝试找到一种并行执行请求并在每个可观察的完成时处理它们的方法。尽管所有可观察对象都做出响应时一切正常,但我没有看到一种方法来处理所有错误。

这是zip运算符的示例,它基本上并行执行2个请求:

Observable.zip(
getObservable1()
.onErrorResumeNext { errorThrowable: Throwable ->
Observable.error(ErrorEntity(Type.ONE, errorThrowable))
}.subscribeOn(Schedulers.io()),
getObservable2()
.onErrorResumeNext { errorThrowable: Throwable ->
Observable.error(ErrorEntity(Type.TWO, errorThrowable))
}.subscribeOn(Schedulers.io()),
BiFunction { value1: String, value2: String ->
return@BiFunction value1 + value2
})
//execute requests should be on io() thread
.subscribeOn(Schedulers.io())
//there are other tasks inside subscriber that need io() thread
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ result ->
Snackbar.make(view, "Replace with your own action " + result, Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
},
{ error ->
Log.d("TAG", "Error is : " + (error as ErrorEntity).error.message)
}
)


private fun getObservable1(): Observable<String> {
return Observable.defer {
throw Throwable("Error 1")
}
}

private fun getObservable2(): Observable<String> {
return Observable.defer {
throw Throwable("Error 2")
}
}

这种方法的问题在于,没有像BiFunction这样的成功案例会加入任何错误的机制。因此,zip运算符将仅触发第一个错误,而忽略其他错误。

输出:
D/TAG: Error is : Error 1

只有在每个可观察的内部zip完成或给出错误之后,才有什么方法可以检索所有错误?

我的主要目标是查看哪些请求产生了错误,并仅在用户出现对话框询问用户是否要重试失败的请求后才执行那些请求。

最佳答案

您可以使用数据类对可观察物建模。例如。

sealed class Response {
data class Success(val data: String) : Response()
data class Error(val t: Throwable) : Response()
}

然后您可以将可观测对象映射到Response,如下所示:
val first: Observable<Response> = observable1
.map<Response> { Response.Success(it) }
.onErrorReturn { Response.Error(it) }

val second: Observable<Response> = observable2
.map<Response> { Response.Success(it) }
.onErrorReturn { Response.Error(it) }

您可以将它们结合起来:
Observable.zip(
first,
second,
BiFunction { t1: Response, t2: Response -> Pair(t1, t2) }
).subscribe({println(it)})

打印:

(Error(t=java.lang.Exception: Error 1), Error(t=java.lang.Exception: Error 2))



还可以看看 this article

关于error-handling - RxAndroid-使用Zip运算符处理错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46648216/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com