Подписка на 2 наблюдаемые, но подписка на вторую, только если условие для первого выполнено - PullRequest
3 голосов
/ 09 марта 2020
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. Я должен вернуть пустой Observable в состоянии else, которое выглядит неправильно. Есть ли лучший способ?

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

Большое спасибо за любые предложения

1 Ответ

2 голосов
/ 12 марта 2020

Я бы предположил, что ваш первый метод лучше. Он точно описывает, что вы хотите, чтобы он делал, и имеет то преимущество, что если вы хотите предпринять какое-то действие, когда productID! = 1234, вы можете иметь другой обратный вызов для выполняемого действия RX. Хотя они делают по существу одно и то же, для второго из них, вероятно, имеются небольшие издержки из-за flatMap, и это также снижает гибкость.

...