2016-02-04 58 views
3

我有一個Observable,它發出一個特定的對象S.這個對象內部有一個對象列表,每個對象都包含一組值。我需要這些數據(將所有內部集合展開爲一系列扁平對象A),如果它尚不存在,則將其存儲在數據庫中,然後將對象A的序列減少到具有相似對象的對象T結構到起始對象S,我需要傳遞它。我應該如何處理RxJava中的副作用?

我認爲在你的函數之外改變狀態並不是一個好主意,所以把它寫成這樣一個大的Observable轉換是一個不可行的(特別是因爲在第二個映射中也有阻塞數據庫調用):

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

然後我發現我應該限制我的用戶的副作用。這將使我與任一下列情況之一:

  • 轉變可觀察觀測到的,然後拋出這些A的到數據庫用戶訂閱。然後查詢數據庫,獲得A的可觀察(萬歲MongoDB的的Rx驅動程序),將它們轉換到T的,並通過他們(與用戶)

  • 使用源可觀的,同時做兩件事情:

    1. 與上一步相似,將其轉換爲Observable並將A存儲在數據庫中。
    2. 將Observable直接轉換爲Observable,並樂觀地傳遞它。

現在,第一個選項看起來更吸引人的一個,儘管它需要比兩個髒版和替代品的第二多個數據庫的操作。是否沒有更好的方式來做這種事情(對數據做一些有用的事情,然後傳遞給它們),而不會對資源造成更大的壓力,也不會改變我的功能之外的狀態?

+0

第二個'map'的返回值是以任何方式*依賴於外部狀態e。 G。它是從數據庫重讀嗎?因爲如果它不是(我認爲,它不應該),那麼你可以使用'doOnNext'來代替。這就清楚地表明,發生了什麼只是一個副作用,對下面發生的事情沒有影響...... –

+0

我對副作用有同樣的問題。在這種情況下,我可能從'obsevable.map(turnSIntoAFn)'獲得observable,並使用它來訂閱以存儲和創建可映射的observable。我不知道這是不是一個好主意。 – otal

回答

3

你應該考慮使用the do operators - 在這種情況下,doOnNext()

doOn[Next/Error/Completed]就像您可以放入序列中的小訂閱一樣。它不是轉換的一部分(因爲它們不能轉換數據)。