【问题标题】:How do i do this in rxjava 2?我如何在 rxjava 2 中做到这一点?
【发布时间】:2019-05-11 20:03:44
【问题描述】:

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

getParentObservable():Observable<Parent>

getChildrenSingle(val parentId: Int): Single<List<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 中,应该为孩子分配他或她的分数。

【问题讨论】:

    标签: android kotlin rx-java rx-java2


    【解决方案1】:

    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
       }
    

    【讨论】:

      猜你喜欢
      • 2019-07-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 1970-01-01
      • 2014-02-08
      • 1970-01-01
      相关资源
      最近更新 更多