Как мне сделать это в rxjava 2? - PullRequest
0 голосов
/ 11 мая 2019

у родителей есть дети. у детей есть тестовые идентификаторы. каждый идентификатор теста соответствует баллу теста. Я хочу, чтобы у каждого ребенка был список результатов тестов.

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 на ребенка. В случае успеха ребенку должны быть назначены его / ее результаты.

1 Ответ

0 голосов
/ 13 мая 2019

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
   }
...