android - 我如何在 rxjava 2 中做到这一点?
问题描述
父母有孩子。孩子们有测试ID。每个测试 ID 对应一个测试分数。我希望每个孩子都有一份他们的考试成绩清单。
getParentObservable():Observable<Parent>
getChildrenSingle(val parentId: Int):Single<List<Child>>
Child 包含我要填写List<Int>
的 testIds 和分数List<Score>
getScoresSingle(val testId: Int):Single<Score>
我已经尝试了以下意外结果:
// children is a class level var List<Child>
var childIndex = 0
getParentObservable()
.flatMap { parent -> getChildrenSingle(parent.Id) }
.flatMapObservable { kids ->
children = kids
Observable.fromIterable(kids)
}
.flatMap { kid -> Observable.fromIterable(kid.testIds) }
.flatMapSingle { testId -> getScoresSingle(testId) }
.toList()
.compose(IoMainThreadScheduler)
.subscribe { currentKidsScores ->
children[childIndex].scores = currentKidsScores
childIndex = childIndex + 1
}
以下是它的外观示意图:
Parent1
-->Child 1
-->TestId1
-->TestScore1
-->Child2
-->TestId1
-->TestScore1
-->TestId2
-->TestScore2
Parent2
-->Child 1
-->TestId1
-->TestScore1
我希望 onSuccess 被调用 3 次,每个孩子 1 次。在 onSuccess 中,应该为孩子分配他或她的分数。
解决方案
onSuccess()
不会被调用 3 次,因为toList()
call 返回 aSingle
并且 aSingle
最多发出一次。尝试这个:
getParentObservable() // Observable<Parent>
.flatMapSingle { parent ->
getChildrenSingle(parent.Id) // Single<List<Child>>
} // Observable<List<Child>>
.flatMap { children ->
Observable.fromIterable(children) // Observable<Child>
} // Observable<Child>
.flatMapSingle { child ->
Observable.fromIterable(child.testIds) // Observable<Int>
.flatMapSingle { testId ->
getScoresSingle(testId)
} // Observable<Score>
.toList() // Single<List<Score>>
.map { scores ->
child.scores = scores
child
} // Single<Child>
} // Observable<Child>
.compose(IoMainThreadScheduler)
.subscribe { child ->
// Do stuff this will called 3 times, 1 time for each child
}
推荐阅读
- php - 如果语句在 9 项后停止工作
- java - Java ClassLoader getResources 不适用于 Launcher$AppClassLoader
- javascript - 如何通过单击上一页中的按钮重定向到新页面并在那里显示模式?
- typescript - 打字稿 npm 库
- python - 基本的 Django 搜索实现
- r - 用从对象中提取的内容替换数据框中的值的有效方法?
- javascript - 如何获取硒中单击事件的按钮路径
- php - 克隆对象可以在单例模式中具有相同的范围吗?
- apache-spark - Spark程序抛出异常
- angular - 对于角度 4 中大于 10 的值,过滤器 orderby 无法按预期工作