第二链请求并返回第一个

时间:2018-01-18 11:21:40

标签: kotlin rx-java rx-java2

我有这样的课程A

A {
   id: Long
   eventId: Long
   event: Event
}

B{
   id:Long
   name: String
}

我想通过执行:

来检索A.
aService.getA(id)

然后使用结果(具有null事件)使用eventId来检索正确的EventeventService.getEvent()),将其分配给A.event,然后返回A

如何链接请求以实现此目的?我尝试使用flatmap返回Event,但后来我丢失了A的结果。

这是我目前的实施:

aRepository.getA().subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .doOnSubscribe {
                            loadingState.onNext(true)
                        }
                        .doOnEvent { t1: Highlight, t2 ->
                            loadingState.onNext(false)
                        }
                        .subscribeWith(object : DisposableSingleObserver<A>() {
                            override fun onSuccess(a: A) {
                                aObservable.onNext(a)
                            }

                            override fun onError(e: Throwable) {
                               fetchErrors.onNext(e)
                            }

                        })

我试过了:

aRepository.getA()
                   .flatMap {
                        a: A ->
                        val event = eventsRepository.getEvent(a.eventId)
                        event
                    }
                        ,subscribeOn(Schedulers.io())
                        .observeOn(AndroidSchedulers.mainThread())
                        .doOnSubscribe {
                            loadingState.onNext(true)
                        }
                        .doOnEvent { t1: Highlight, t2 ->
                            loadingState.onNext(false)
                        }
                        .subscribeWith(object : DisposableSingleObserver<A>() {
                            override fun onSuccess(a: A) {
                                aObservable.onNext(a)
                            }

                            override fun onError(e: Throwable) {
                               fetchErrors.onNext(e)
                            }

                        })

1 个答案:

答案 0 :(得分:2)

使用flatMap并将其内部流程映射回更新的原始值:

aRepository.getA()
.subscribeOn(Schedulers.io())
.flatMap(a -> {
    if (a.event == null) {
        return eventsRepository.getEvent(a.eventId)
               .map(evt -> {
                   a.event = evt;
                   return a;
               });
    }
    return Single.just(a);
})
.observeOn(AndroidSchedulers.mainThread())
.subscribeWith(/* ... */)
;