我如何在rxjava 2中执行此操作?

时间:2019-05-11 20:03:44

标签: android kotlin rx-java rx-java2

父母有孩子。孩子们有测试ID。每个测试ID对应一个测试分数。我希望每个孩子都有他们的考试成绩清单。

getParentObservable():Observable<Parent>

getChildrenSingle(val parentId:Int):Single<List<Child>>

孩子包含List<Int>个testId和一个我要填写的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内部,应该给孩子分配他或她的成绩。

1 个答案:

答案 0 :(得分:0)

onSuccess()不会被调用3次,因为toList()调用返回一个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
   }