【发布时间】:2020-03-09 15:44:10
【问题描述】:
RxJava 2
我有以下内容,我订阅了 2 个 observables,它工作正常。我不认为这是最好的方法。
如果第一个getProductDetails满足条件,我只想订阅第二个getSalesInfo。这只是我正在尝试做的一个示例。如果条件不满足,则不会发生任何事情。
fun main(args: Array<String>) {
getProductDetails()
.subscribeBy { productDetails ->
if (productDetails.productID == 1234) {
getSalesInfo().subscribeBy {
getSalesInfo()
.subscribeBy { saleInfo ->
println(saleInfo.salesReference)
}
}
}
}
}
fun getProductDetails(): Observable<ProductDetails> =
Observable.just(ProductDetails(1234, "Product One"))
fun getSalesInfo(): Observable<SaleInfo> =
Observable.just(SaleInfo("Sales Reference 1"))
data class ProductDetails(val productID: Int,
val productDescription: String)
data class SaleInfo(val salesReference: String)
我发现的另一种选择是使用flatmap,它将返回第二个SaleInfo observable。我必须在看起来不正确的 else 条件下返回一个空的 Observable。有没有更好的办法?
getProductDetails()
.flatMap { productDetails: ProductDetails ->
if (productDetails.productID == 1234) {
getSalesInfo()
}
else {
Observable.empty()
}
}
.subscribeBy { saleInfo ->
println("Using flatmap ${saleInfo.salesReference}")
}
非常感谢您的任何建议
【问题讨论】:
-
在这种情况下,您可以将
filter()与flatMap()结合使用。类似getProductDetails().filter { it.productID == 1234 }.flatMap {getSalesInfo() }.subscribe { saleInfo -> println("Using flatmap ${saleInfo.salesReference}")} -
对于您的问题,可能有比在第一个 observable 处订阅第二个 observable 发出特定对象更自然的反应式解决方案。例如组合 Observables、应用 filter() 等。你能提供更多关于你想要实现的目标的信息吗?
标签: rx-java2 rx-kotlin2