android - RxJava - 在“订阅” lambda 中使用不同类型的变量(多链运算符的结果)
问题描述
我正在尝试以这种方式重写以下 rx-code 以删除另一个订阅中的订阅并使代码看起来更惯用:
private fun foo() {
compositeDisposable.add(getApiDataObservable().subscribe({ result ->
if (!result.isSuccess) {
mutableLiveData.value = "errorMessage"
} else {
compositeDisposable.add(Observable.zip(firstObservable,
secondObservable,
BiFunction<FirstObject, SecondObject, Pair<FirstObject, SecondObject>>
{ obj1, obj2 -> Pair(obj1, obj2) }
).subscribe({
//there I need to use result and pair values
}, {
Timber.e(it)
}))
}
}))
}
我试过这样的事情:
private fun foo2() : Disposable {
return getApiDataObservable()
.filter { result.isSuccess }
.flatMap {
//it - result
Observable.zip(firstObservable,
secondObservable,
BiFunction<FirstObject, SecondObject, Pair<FirstObject, SecondObject>>
{ obj1, obj2 -> Pair(obj1, obj2) })
}.subscribe {
//it - Pair<FirstObject, SecondObject>
// here I need both - result and pair values
},{ mutableLiveData.value = "errorMessage"}
}
但我在下一点有一个误解:我如何从 in的调用中获取结果值getApiDataObservable()
和一对结果值。首先想到的是:将结果值存储在某个变量中并在 lambda 中使用它。但也许有可能以更优雅和更多 rx 的方式实现。Observable.zip(..)
subscribe
subscribe
解决方案
我认为您可以将两者结合起来,result
并且pair
当两者都可以访问时,返回一个组合对象。在下面的示例中,它是一个Pair<Result, Pair<FirstObject, SecondObject>>
,但最好创建一个专用对象。
private fun foo2() : Disposable {
return getApiDataObservable()
.filter { result.isSuccess }
.flatMap {
//it - result
Observable.zip(firstObservable,
secondObservable,
BiFunction<FirstObject, SecondObject, Pair<FirstObject, SecondObject>>
{ obj1, obj2 ->
val pair = Pair(obj1, obj2)
Pair(it, pair)
})
}.subscribe {
//it - Pair<Result, Pair<FirstObject, SecondObject>>
},{ mutableLiveData.value = "errorMessage"}
}
另请注意,如果您不会收到任何回调,.filter { result.isSuccess }
则不会触发进一步的链。result.isSuccess = false
推荐阅读
- python - 如何在 Swift 中运行 tf2.0 模型
- rust - 将静态字符串传递给 rust 中的 macro_rule
- excel - 取消选项 GetOpenFilename(Multiselect:= True)
- javascript - 如何从 firebase 获取数据
- laravel - 使用 Laravel Queue 在单个队列作业中处理多条消息
- python - 计时器从程序开始而不是起点开始
- javascript - JavaScript Vue 在数据库中插入多个名字作为多行。我应该为此使用每个循环吗?
- sequelize.js - 我正在使用 docker 和 sequelize 处理 nodejs 项目,我收到错误:无法读取未定义的 toString 属性
- java - 点击recyclerView new activity Error Attempt to invoke virtual method
- c++ - 为什么我的数组不能正确打印(冒泡排序)