首页 > 解决方案 > RxJava - 在“订阅” lambda 中使用不同类型的变量(多链运算符的结果)

问题描述

我正在尝试以这种方式重写以下 rx-code 以删除另一个订阅中的订阅并使代码看起来更惯用:

 private fun foo() {
        compositeDisposable.add(getApiDataObservable().subscribe({ result ->
            if (!result.isSuccess) {
                mutableLiveData.value = "errorMessage"
            } else {
                compositeDisposable.add(Observable.zip(firstObservable,
                        secondObservable,
                        BiFunction<FirstObject, SecondObject, Pair<FirstObject, SecondObject>>
                        { obj1, obj2 -> Pair(obj1, obj2) }
                ).subscribe({

                    //there I need to use result and pair values
                }, {
                    Timber.e(it)
                }))
            }
        }))
    }

我试过这样的事情:

private fun foo2() : Disposable {
      return  getApiDataObservable()
                .filter { result.isSuccess }
                .flatMap {
                    //it - result
                    Observable.zip(firstObservable,
                            secondObservable,
                            BiFunction<FirstObject, SecondObject, Pair<FirstObject, SecondObject>>
                            { obj1, obj2 -> Pair(obj1, obj2) })
                }.subscribe {
                    //it - Pair<FirstObject, SecondObject>
               // here I need both  - result and pair values
                },{ mutableLiveData.value = "errorMessage"}
    }

但我在下一点有一个误解:我如何从 in的调用中获取结果getApiDataObservable()和一结果值。首先想到的是:将结果值存储在某个变量中并在 lambda 中使用它。但也许有可能以更优雅和更多 rx 的方式实现。Observable.zip(..)subscribesubscribe

标签: androidkotlinrx-javaobservablerx-java2

解决方案


我认为您可以将两者结合起来,result并且pair当两者都可以访问时,返回一个组合对象。在下面的示例中,它是一个Pair<Result, Pair<FirstObject, SecondObject>>,但最好创建一个专用对象。

private fun foo2() : Disposable {
      return  getApiDataObservable()
                .filter { result.isSuccess }
                .flatMap {
                    //it - result
                    Observable.zip(firstObservable,
                            secondObservable,
                            BiFunction<FirstObject, SecondObject, Pair<FirstObject, SecondObject>>
                            { obj1, obj2 -> 
                                val pair = Pair(obj1, obj2)
                                Pair(it, pair)
                            })
                }.subscribe {
                    //it - Pair<Result, Pair<FirstObject, SecondObject>>
                },{ mutableLiveData.value = "errorMessage"}
    }

另请注意,如果您不会收到任何回调,.filter { result.isSuccess }则不会触发进一步的链。result.isSuccess = false


推荐阅读