我的具体情况是我想在localforage和其他端点之间运行缓存竞争,如下所示:
这里的想法是,在大多数情况下,localforage将有一些可能非常快速返回的可能过时的数据,但是当其余端点请求完成时,数据将会更新。我可以在这两个流上进行合并,假设localforage总是在其余请求之前返回(一个不合理的假设,但仍然是一个假设)。问题是,如果其余响应具有权威性并且由于某种原因比localforage响应更快,那么在正确的休息响应之后,将发出过时的缓存数据信号。
所以我想对这些流做.race()
,但不是真的,因为如果streamA首先完成,我想与streamB合并。如果streamB首先完成,我想取消streamA。
到目前为止,我已经使用了takeUntil
和race
,这种作品:
const streamA = Rx.Observable.fromFOO();
const streamB = Rx.Observable.fromBAR().publish();
const cacheRace = streamA.takeUntil(streamB).merge(streamB);
cacheRace.subscribe(listener);
streamB.connect();
我需要使用发布/连接的东西,因为实际上streamB会启动两个REST请求 - 一个用于takeUntil,一个用于合并。这非常令人不满意。感觉就像我缺少的运营商是takeUntilButNextOnce()或其他东西,或者运算符合并两个流但是如果两个流中的一个完成则完成合并流(但如果另一个流完成则不完整)
我可以代替摆弄自定义的observables和/或主题,只是处理在封闭范围内保留状态,然后让我在这里使用普通的旧逻辑。
答案 0 :(得分:1)
一个简单的merge
与takeUntil
结合使用 - 也只是share
其余的调用,应该处理您提到的双重请求问题。< / p>
const fromRest$ = myRestService.getDataFromServer().share();
const fromForage$ = ...;
data$ = Observable.merge(
fromRest$,
fromForage$.takeUntil(fromRest$)
);