我试图找到并行执行请求的方法,并在每个observable完成时处理它们。尽管当所有可观测量都给出响应时一切正常,但是当一切都完成时我没有看到处理每个错误的方法。
这是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完成或发出错误后检索所有错误?
我的主要目标是查看哪些请求发出错误,并且只有在用户询问他是否要重试失败的请求后才会执行对话。
答案 0 :(得分:2)
您可以使用数据类对可观察对象进行建模。 E.g。
sealed class Response {
data class Success(val data: String) : Response()
data class Error(val t: Throwable) : Response()
}
然后您可以将您的observable映射到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)})
打印:
(错误(t = java.lang.Exception:错误1),错误(t = java.lang.Exception: 错误2))
另请查看this article。