如何通过RxJava链式调用实现获取A并填充其Event属性?
RxJava链式调用实现A对象填充Event属性的解决方案
我明白你现在的困扰:想通过RxJava链式调用先获取A对象,再用它的eventId拿到对应的Event,把Event赋值给A的event属性后再返回完整的A,但之前用flatMap的时候不小心丢失了A的实例,导致下游拿不到填充好的A对象。
问题分析
你之前的写法里,flatMap直接返回了eventsRepository.getEvent(a.eventId)的结果(也就是Event对象),这就导致整个Observable链的输出类型变成了Event,而不是原来的A,自然下游的DisposableSingleObserver<A>会出现类型不匹配,同时也丢失了原本的A实例。
正确的链式实现
我们需要在flatMap里同时保留A的引用,拿到Event后把它赋值给A,再返回A对象,这样整个链的输出依然是填充好Event的A。代码如下:
aRepository.getA() .flatMapSingle { a: A -> // 保留A的引用,调用获取Event的接口 eventsRepository.getEvent(a.eventId) // 拿到Event后赋值给A,返回填充后的A .map { event: Event -> a.event = event a } } .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .doOnSubscribe { loadingState.onNext(true) } .doOnEvent { _, _ -> loadingState.onNext(false) } .subscribeWith(object : DisposableSingleObserver<A>() { override fun onSuccess(a: A) { aObservable.onNext(a) } override fun onError(e: Throwable) { fetchErrors.onNext(e) } })
关键说明
- 用
flatMapSingle替代普通flatMap:因为你的getA()和getEvent()都是返回单个对象的请求,对应RxJava的Single类型,flatMapSingle更适合这种嵌套的Single请求场景 - 嵌套的
map操作:在获取到Event后,我们把它赋值给A的event属性,然后返回A,这样下游就能拿到完整的、填充好Event的A对象 - 原有逻辑保留:线程调度、加载状态通知、订阅逻辑都和你原来的代码一致,只修改了中间处理Event的部分
内容的提问来源于stack exchange,提问作者M Rajoy
相关产品推荐
相关产品推荐

