订阅2个可观察对象,但仅在第一个条件为真的情况下订阅第二个可观察对象

时间:2020-03-09 15:44:10

标签: rx-java2 rx-kotlin2

RxJava 2

我订阅了以下2个可观察项,它可以正常工作。我认为这不是最好的方法。

如果第一个getSalesInfo符合条件,我只想订阅第二个getProductDetails。这只是我正在尝试做的一个示例。如果不满足条件,则不会发生其他任何事情。

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。我必须在else条件不正确的情况下返回一个空的Observable。有更好的方法吗?

getProductDetails()
            .flatMap { productDetails: ProductDetails ->
                if (productDetails.productID == 1234) {
                    getSalesInfo()
                }
                else {
                    Observable.empty()
                }
            }
            .subscribeBy { saleInfo ->
                println("Using flatmap ${saleInfo.salesReference}")
            }

非常感谢您的任何建议

1 个答案:

答案 0 :(得分:2)

我建议您的第一种方法更好。它准确地描述了您要执行的操作,并具有以下优点:如果要在productID!= 1234时执行某些操作,则可以为执行的RX操作使用不同的回调。尽管它们基本上执行相同的操作,但是由于flatMap的原因,第二个可能会略有开销,并且还会降低灵活性。