2017-03-15 32 views
1

我的具體情況是,我想運行localforage和休息端點,看起來像之間的緩存種族:資源信令可觀察到年底,但捕捉信號

  • 開始請求
  • 如果localforage在休息之前返回,向用戶發送信號
  • 休息返回時,向用戶發送信號
  • 如果在localforage之前返回了其他休息,則不發信號通知localforage響應。

這裏的想法是,在大多數情況下,localforage會有一些可能非常快速返回的過期數據,但是當剩餘端點請求完成時數據將被更新。我可以對這兩個流進行合併,假設localforage將始終在其他請求之前返回(這是一個不合理的假設,但仍然是一個假設)。問題是,如果其他響應具有權威性並且出於某種原因比本地草稿響應更快,則在之後將會發出過時的緩存數據正確的休息響應。

所以我有點想在這些流上做一個.race(),但不是真的,因爲如果streamA首先完成,我想要與streamB合併。如果streamB首先完成,我想取消streamA。

到目前爲止,我已經打了takeUntilrace,而這種作品:

const streamA = Rx.Observable.fromFOO(); 
const streamB = Rx.Observable.fromBAR().publish(); 
const cacheRace = streamA.takeUntil(streamB).merge(streamB); 
cacheRace.subscribe(listener); 
streamB.connect(); 

我需要使用發佈/連接東西,因爲streamB否則實際上揭開序幕兩個靜止請求 - 一個用於takeUntil,一個用於合併。這很不令人滿意。感覺像我缺少的操作符是takeUntilButNextOnce()或其他東西,或者是合併兩個流但完成合並流的操作符,如果兩個流中的一個完成(但是如果另一個完成則不完成)。

我可以定製的觀測和/或主題,只是處理內部保持狀態,而不是反覆折騰封閉了範圍,然後讓我在這裏使用普通的舊邏輯。

回答

1

結合一個簡單的mergetakeUntil應該做的 - 也只是share其餘的呼叫,應該照顧你提到的雙重要求的問題。

const fromRest$ = myRestService.getDataFromServer().share(); 
const fromForage$ = ...; 
data$ = Observable.merge(
    fromRest$, 
    fromForage$.takeUntil(fromRest$) 
);