发出可观察信号的结尾信号,但捕获该信号

时间:2017-03-15 18:45:09

标签: rxjs rxjs5

我的具体情况是我想在localforage和其他端点之间运行缓存竞争,如下所示:

  • 启动资源请求
  • 如果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会启动两个REST请求 - 一个用于takeUntil,一个用于合并。这非常令人不满意。感觉就像我缺少的运营商是takeUntilButNextOnce()或其他东西,或者运算符合并两个流但是如果两个流中的一个完成则完成合并流(但如果另一个流完成则不完整)

我可以代替摆弄自定义的observables和/或主题,只是处理在封闭范围内保留状态,然后让我在这里使用普通的旧逻辑。

1 个答案:

答案 0 :(得分:1)

一个简单的mergetakeUntil结合使用 - 也只是share其余的调用,应该处理您提到的双重请求问题。< / p>

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