可能是rx newbee问题。
如果我有两个具有某些通用部分的rx流,是否有可能提取并重新使用它们?
这是伪代码示例:
someManager.getInfo(id) returns a Single<SometInfo>
这个好玩的方法有一个ID,应该只返回一个状态为
fun getStatus(id: String): Single<Status> =
someManager.getInfo(id)
.flattenAsObservable { it.items }
.map { getSomeProp(it) } // from here
.toList()
.map { getStatus(it) }
.doOnSuccess { getStatusRelay(id).accept(it) } // until here it's common
并且这个没有ID但已经有一个对象,应该检查状态是否正常
fun isStatusOk(info: SomeInfo): Single<Boolean> =
Observable.fromIterable(info.items)
.map { getSomeProp(it) } // from here
.toList()
.map { getStatus(it) }
.doOnSuccess { getStatusRelay(id).accept(it) } // until here it's common
.map { it == Status.OK }
提前谢谢
答案 0 :(得分:1)
您还可以使用扩展功能
fun Observable<Item>.convertToSingeStatus(): Single<Status> =
this.map { getSomeProp(it) }
.toList()
.map { getStatus(it) }
.doOnSuccess { getStatusRelay(id).accept(it) }
然后
fun getStatus(id: String): Single<Status> =
someManager.getInfo(id)
.convertToSingeStatus()
.doOnSuccess { getStatusRelay(id).accept(it) }
答案 1 :(得分:0)
凤凰王建议使用变形金刚。我尝试了它们,经过一些实验,看来我可以正常使用了。
我创建了SingleTransformer:
private fun getStatus() =
SingleTransformer<SomeInfo, Status> {
it.flatMap {
Observable.fromIterable(it.items)
.map { getSomeProp(it) }
.toList()
.map { getStatus(it) }
}
}
然后我可以重构
fun getStatus(id: String): Single<Status> =
someManager.getInfo(id)
.compose(getStatus())
.doOnSuccess { getStatusRelay(id).accept(it) }
这也是
fun isStatusOk(info: SomeInfo): Single<Boolean> =
Single.just(info)
.compose(getStatus())
.doOnSuccess { getStatusRelay(id).accept(it) }
.map { it == Status.OK }
希望它对其他人有帮助。