Rx java 我应该如何处理RxJava中的副作用?

Rx java 我应该如何处理RxJava中的副作用?,rx-java,Rx Java,我有一个可观测的物体,它发射一个特定的物体。这个物体内部有一个物体列表,每个物体都包含一组值。我需要这个数据平面(将所有内部集合展开为一长串平面对象a),如果它不存在,则将其存储在数据库中,然后将对象a的序列缩减为一个对象t,其结构与启动对象S相似,我需要传递它 我认为在函数之外更改状态不是一个好主意,因此将其作为一个大的可观察转换来编写是不可能的(特别是因为在第二个映射中还有一个阻塞数据库调用): sObservable .map(转为OAFn)//{ 仓库(a); 返回a; }) map(T

我有一个可观测的物体,它发射一个特定的物体。这个物体内部有一个物体列表,每个物体都包含一组值。我需要这个数据平面(将所有内部集合展开为一长串平面对象a),如果它不存在,则将其存储在数据库中,然后将对象a的序列缩减为一个对象t,其结构与启动对象S相似,我需要传递它

我认为在函数之外更改状态不是一个好主意,因此将其作为一个大的可观察转换来编写是不可能的(特别是因为在第二个映射中还有一个阻塞数据库调用):

sObservable
.map(转为OAFn)//{
仓库(a);
返回a;
})
map(TurnToTfn)//p>您应该考虑使用这种情况下,<代码> DOONNEXT()/<代码> < /P>

doOn[Next/Error/Completed]
就像是可以按顺序进行订阅的小副作用。这不是转换的一部分(因为它们无法转换数据)。

我更喜欢使用另一个操作符,如
concatMap()
switchMap()
(它们之间的区别是另一个主题)。特别是如果您在某些数据库中有
存储(a)
操作(例如SQL)


doOn[Next/Error/Completed]
-是异步回调,它们的最佳用例是一些操作,比如在UI进度条上显示/隐藏

是第二个
映射的返回值,以任何方式取决于外部状态,例如。G是否从数据库中重新读取?因为如果它不是(我认为它不应该),那么您可以使用
doOnNext
。这清楚地表明,在那里发生的只是一个副作用,对下面发生的事情没有影响……我对副作用也有同样的问题。在这种情况下,我可以从
obsevable.map(turnSIntoAFn)
中获取可观察对象,并将其用于订阅存储和创建要映射的可观察对象。我不知道这是否是个好主意。
sObservable
    .map(turnSIntoAFn)     // <-- Actually more complex
    .map(a -> {
         store(a);
         return a;
    })
    .map(turnAIntoTFn)     // <-- Actually more complex
    .subscribe(...);