我如何在 rxjava 2 中执行此操作?
How do i do this in rxjava 2?
parents有child仁。 children 有测试 ID。每个测试ID对应一个测试分数。我希望每个 child 都有一份他们的考试成绩列表。
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 次,每个 child 调用 1 次。在 onSuccess 中,child 应该被分配他或她的分数。
onSuccess()
不会被调用 3 次,因为 toList()
调用 returns 一个 Single
和一个 Single
最多发出一次。试试这个:
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
}
parents有child仁。 children 有测试 ID。每个测试ID对应一个测试分数。我希望每个 child 都有一份他们的考试成绩列表。
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 次,每个 child 调用 1 次。在 onSuccess 中,child 应该被分配他或她的分数。
onSuccess()
不会被调用 3 次,因为 toList()
调用 returns 一个 Single
和一个 Single
最多发出一次。试试这个:
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
}