【问题标题】:Is it possible to use a method(returning an Observable) inside side effect operator(doOnNext())?是否可以在副作用运算符(doOnNext())中使用方法(返回 Observable)?
【发布时间】:2018-02-12 18:11:14
【问题描述】:

我刚刚开始将 RxJava 引入我现有的项目。

我有一个名为getUser() 的数据库操作方法(在数据层中),它返回一个Observable<User>。 我在 3 个不同的地方使用了这种方法。在这 3 个中,我需要在 2 个地方返回一个 Observable<User> 的方法。但是,问题出现在我需要在doOnNext()副作用运算符中访问此方法的地方。

AFAIK,doOnNext() 不会更改流并继续上一个线程。如果流已经在 io 线程上,我们可以继续新的后台操作,而无需创建/使用 Observable。

片段

getDataManager().getUser(id)
                        .doOnNext(user -> getDataManager().insertUser(user))
                        .subscribeOn(getSchedulerProvider().io())
                        .observeOn(getSchedulerProvider().ui())
                        .subscribe()

这个insertUser() 方法返回Observable<Long>,这就是我希望它用于其他部分的方式。但是对于这个副作用运算符,我需要它只返回 Long。

有什么方法可以删除 Observable 包装器吗?还是我需要创建两种不同的方法?

【问题讨论】:

  • 你打算如何使用insertUser(user)返回的Long
  • 我认为返回类型与上述问题没有任何关系。你觉得有什么联系吗?

标签: android rx-java rx-java2


【解决方案1】:

对于返回 Observable 的相关计算/IO,通常使用 flatMapconcatMap 运算符。

getDataManager()
.getUser(id)
.concatMap(user ->
    getDataManager()
    .insertUser(user)
)
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe()

如果您仍然需要原始的user,只需将其映射回来:

getDataManager()
.getUser(id)
.concatMap(user ->
    getDataManager()
    .insertUser(user)
    .ignoreElements()
    .andThen(Observable.just(user))
)
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.subscribe()

【讨论】:

  • 是的,非常正确。但我想我忘了提到问题中的另一点。使用concatMap() 将改变流。我希望流不会改变,这就是我玩doOnNext() 的原因。我使用订阅 onNext() 内部源流中的 User 对象。
  • 这是您忘记的一个重要细节。我已经更新了该案例的答案。
猜你喜欢
  • 2018-01-17
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
  • 1970-01-01
  • 2015-05-05
  • 2020-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多