kotlin - RxJava:运行一个可完成的列表,直到一个成功
问题描述
我有一个函数,它接受一个输入并返回一个 Completable。
我想在候选输入列表上按顺序运行该函数,直到找到一个 Completable 完成且没有错误的函数。
fun doStuff(input: Int): Completable { ... }
Observable.just(1,2,3,4)
.flatMapCompletable { doStuff(it) }
.??? // Run completables until one succeeds
我没有使用merge
,或者concat
因为他们将执行所有 Completables。一旦找到成功的 Completables,我希望它停止执行 Completables。
是否有实现此行为的标准操作?
解决方案
可能的解决方案,虽然需要一点 RxAcrobatics:
Observable
.just(1, 2, 3, 4)
.flatMapSingle { arg ->
doStuff(arg)
.toSingle { true }
.onErrorReturn { false }
}
.filter { it }
.firstElement()
.subscribe()
如果您可以控制返回 的函数Completable
,我建议将其更改为 a Single<Boolean>
,这样您可以像这样更优雅地使用takeUntil
:
Observable
.just(1,2, 3, 4)
.flatMapSingle(::doStuff)
.takeUntil { it }
.subscribe()
如果您无法控制返回 Completable 的函数,您仍然可以创建一个小包装器:
private fun doStuffWrap(foo: Int) = doStuff(foo)
.toSingle { true }
.onErrorReturn { false }
并使用优雅的解决方案:
Observable
.just(1, 2, 3, 4)
.flatMapSingle(::doStuffWrap)
.takeUntil { it }
.subscribe()
推荐阅读
- ruby-on-rails - JWT 身份验证尝试返回 404
- python - 使用 Python 获取 Steam 市场价格历史
- c++ - 在构造函数继承中使用默认构造函数
- java - 如何正确管理具有 OneToOne BiDirectional 关系的关联 JPA 实体?
- c# - 微调器不显示所选值
- reactjs - 部署新版本的 ASP.NET Core / React 应用程序时如何确保客户端完全重新加载?
- python - FileNotFoundError:[Errno 2],使用绝对路径和 BAT 文件:WindowsServer 16/Python
- ios - 为什么 GMSMapView 没有设置在合适的坐标?
- machine-learning - 为什么使用多项朴素贝叶斯分类器对正类和负类进行几乎相同的前 10 个特征?
- ios - 隐藏 iOS 导航栏中的所有内容,包括图标