小编wgf*_*gfm的帖子

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

我有一个Observable,它发出一个特定的对象S.这个对象内部有一个对象列表,每个对象都包含一组值.我需要将这些数据平放(将所有内部集合展开为长序列的平面对象A),如果它尚不存在则将其存储在数据库中,然后将对象A的序列减少回具有类似的对象T结构到起始对象S,我需要传递.

我认为在函数之外改变状态不是一个好主意,所以把它写成像这样的一个大的Observable转换是不行的(特别是因为在第二个映射中还有一个阻塞数据库调用):

sObservable
    .map(turnSIntoAFn)     // <-- Actually more complex
    .map(a -> {
         store(a);
         return a;
    })
    .map(turnAIntoTFn)     // <-- Actually more complex
    .subscribe(...);
Run Code Online (Sandbox Code Playgroud)

然后我想我应该将我的副作用限制在订阅者身上.这会让我遇到以下任何一种情况:

  • 将Observable转换为Observable,然后订阅将这些A抛出到数据库中的订阅者.然后查询数据库,在Observable中获取A(对于MongoDB的Rx驱动程序很好),将它们转换为T并传递它们(与订阅者一起)

  • 使用源Observable,同时做两件事:

    1. 与上一步一样,将其转换为Observable并将A存储在数据库中.
    2. 将Observable直接转换为Observable,并乐观地传递它.

目前,第一个选项看起来更具吸引力,尽管它需要比脏版本和第二个替代版本更多的数据库操作.有没有更好的方法来做这种事情(做一些有用的数据,然后传递它),既不会对资源造成更大的压力,也不会改变我职能之外的状态?

rx-java

7
推荐指数
1
解决办法
1264
查看次数

标签 统计

rx-java ×1