在 RxKotlin 中为另一个 Single<List> 的所有元素获取 Single<List>
Fetching a Single<List> for all elements of another Single<List> in RxKotlin
A、B、C为对象
所有函数调用都是针对 Rooms 数据库进行的
此代码片段在 ViewModel 中
repo = 存储库
所以我正在制作一个 android 应用程序(无法提供详细信息)并且对于特定屏幕我需要执行以下操作。
我的第一个调用是 repo.getInfo,它 returns 一个 Single Observable ListOfA: Single<List<A>>
//执行一些操作
对于 ListOfA 的每个元素,我需要调用另一个函数 repo.getB(A),其中 returns 一个单一 Observable ListOfB:Single<List<B>>
// 执行一些操作
对于 ListOfB 的每个元素,我需要调用另一个函数 repo.getC(B),其中 returns 一个单一 Observable ListOfC:Single<List<C>>
// 执行一些操作
获得所需数据后,我需要调用另一个函数来组合数据以显示在 UI。
现在我无法让它工作。这是我试过的。但是流程在标记为 THIS LINE 的行处停止并跳转到订阅块。
对函数的单独调用有效,因此数据不是问题。
我对此很陌生,坦率地说超出了我的理解范围。任何帮助或提示表示赞赏。谢谢
localListOfA = emptyList<A>()
localListOfB = emptyList<B>()
localListOfC = emptyList<C>()
compositeDisposable.add(
getInfo.map{listOfA ->
localListOfA.addAll(listofA)
listOfA.map {elementA -> ////THIS LINE
getB(elementA.id).map{listOfB ->
listOfB.filter {
//some logic to select a few objects
}
}.map { it // filtered list of B
localListofB.addAll(it)
localListOfB.last() //I only need the top element of this list
}.map{elementB ->
getC(elementB.id).map{ listOfC ->
localListOfC.addAll(listOfC)
//do some operations
}
}
}
}
.subscribeOn(DEFAULT_CACHED_SCHEDULERS)
.observeOn(AndroidSchedulers.mainThread())
.doOnError(/*take log*/)
.subscribe{
prepareUi()
}
)
您可以使用 .flattenAsObservable
将 List
扁平化为 Observable
getInfo // Single<List<A>>
.doOnSuccess { localListOfA.addAll(it) } // Side effect, adding to localListOfA
.flattenAsObservable { it } // Observable<A>
.flatMapSingle { elementA -> getB(elementA.id) } // Observable<List<B>>
.map { it.filter { true } } // Some logic to select a few objects from B
.doOnNext { localListOfB.addAll(it) } // Side effect, adding to localListOfB
.map { it.last() } // Observable<B>, only the last element
.flatMapSingle { elementB -> getC(elementB.id) } // Observable<List<C>>
.doOnNext { localListOfC.addAll(it) } // Side effect, adding to localListOfC
.flatMapIterable { it } // Observable<C>
现在,您提到您需要以某种方式合并这些数据。在 Rx 中,您可以嵌套链以访问中间数据。例如,如果您有一个 returns 一个 Single<Foo>
的调用,并且您需要 Foo
用于函数 getBar(foo: Foo): Single<Bar>
,实现此目的的一种方法如下:
getFoo().flatMap { foo -> // .concatMap, .switchMap
getBar(foo).map { bar ->
// Use both foo and bar
}
}
A、B、C为对象
所有函数调用都是针对 Rooms 数据库进行的
此代码片段在 ViewModel 中
repo = 存储库
所以我正在制作一个 android 应用程序(无法提供详细信息)并且对于特定屏幕我需要执行以下操作。
我的第一个调用是 repo.getInfo,它 returns 一个 Single Observable ListOfA: Single<List<A>>
//执行一些操作
对于 ListOfA 的每个元素,我需要调用另一个函数 repo.getB(A),其中 returns 一个单一 Observable ListOfB:Single<List<B>>
// 执行一些操作
对于 ListOfB 的每个元素,我需要调用另一个函数 repo.getC(B),其中 returns 一个单一 Observable ListOfC:Single<List<C>>
// 执行一些操作
获得所需数据后,我需要调用另一个函数来组合数据以显示在 UI。
现在我无法让它工作。这是我试过的。但是流程在标记为 THIS LINE 的行处停止并跳转到订阅块。 对函数的单独调用有效,因此数据不是问题。 我对此很陌生,坦率地说超出了我的理解范围。任何帮助或提示表示赞赏。谢谢
localListOfA = emptyList<A>()
localListOfB = emptyList<B>()
localListOfC = emptyList<C>()
compositeDisposable.add(
getInfo.map{listOfA ->
localListOfA.addAll(listofA)
listOfA.map {elementA -> ////THIS LINE
getB(elementA.id).map{listOfB ->
listOfB.filter {
//some logic to select a few objects
}
}.map { it // filtered list of B
localListofB.addAll(it)
localListOfB.last() //I only need the top element of this list
}.map{elementB ->
getC(elementB.id).map{ listOfC ->
localListOfC.addAll(listOfC)
//do some operations
}
}
}
}
.subscribeOn(DEFAULT_CACHED_SCHEDULERS)
.observeOn(AndroidSchedulers.mainThread())
.doOnError(/*take log*/)
.subscribe{
prepareUi()
}
)
您可以使用 .flattenAsObservable
List
扁平化为 Observable
getInfo // Single<List<A>>
.doOnSuccess { localListOfA.addAll(it) } // Side effect, adding to localListOfA
.flattenAsObservable { it } // Observable<A>
.flatMapSingle { elementA -> getB(elementA.id) } // Observable<List<B>>
.map { it.filter { true } } // Some logic to select a few objects from B
.doOnNext { localListOfB.addAll(it) } // Side effect, adding to localListOfB
.map { it.last() } // Observable<B>, only the last element
.flatMapSingle { elementB -> getC(elementB.id) } // Observable<List<C>>
.doOnNext { localListOfC.addAll(it) } // Side effect, adding to localListOfC
.flatMapIterable { it } // Observable<C>
现在,您提到您需要以某种方式合并这些数据。在 Rx 中,您可以嵌套链以访问中间数据。例如,如果您有一个 returns 一个 Single<Foo>
的调用,并且您需要 Foo
用于函数 getBar(foo: Foo): Single<Bar>
,实现此目的的一种方法如下:
getFoo().flatMap { foo -> // .concatMap, .switchMap
getBar(foo).map { bar ->
// Use both foo and bar
}
}