【问题标题】:Subscribing to 2 observables but only subscribe to the second one if a condition is true for the first one订阅 2 个可观察对象,但仅在第一个条件为真时订阅第二个
【发布时间】: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 -&gt; println("Using flatmap ${saleInfo.salesReference}")}
  • 对于您的问题,可能有比在第一个 observable 处订阅第二个 observable 发出特定对象更自然的反应式解决方案。例如组合 Observables、应用 filter() 等。你能提供更多关于你想要实现的目标的信息吗?

标签: rx-java2 rx-kotlin2


【解决方案1】:

我建议您的第一种方法更好。它准确地描述了你想要它做什么,并且如果你想在 productID != 1234 时采取一些行动,你可以对所采取的 RX 行动有不同的回调。虽然它们基本上做同样的事情,但由于 flatMap,第二个可能会有一点开销,而且它也会降低灵活性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-21
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 2018-08-05
    • 2019-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多