发出可观察对象结束的信号,但捕获该信号
Signalling the end of an observable, but capturing that signal
我的具体情况是我想 运行 localforage 和 rest 端点之间的缓存竞争,如下所示:
- 开始请求资源
- 如果 localforage 在休息前 returns,向订阅者发出信号
- 当休息 return 秒时,向订阅者发出信号
- 如果在 localforage 之前休息 returned,则不要发出 localforage 响应信号。
这里的想法是,在大多数情况下,localforage 会有一些可能是过时的数据,可以非常快速地 returned,但是当 rest 端点请求时,数据将被更新完成。我可以对这两个流进行合并,假设 localforage 将始终 return 在其余请求之前(一个并非不合理的假设,但仍然是一个假设)。问题是,如果休息响应是权威的并且由于某种原因比 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() 或其他东西,或者合并两个流但如果两个流之一完成则完成合并流的运算符(但如果另一个流完成则不完成)。
我可以 代替 fiddle 使用自定义可观察对象 and/or 主题,只处理在封闭范围内保存状态,然后让我在这里使用普通的旧逻辑。
一个简单的 merge
结合 takeUntil
应该可以做到 - 也只是 share
休息电话,应该解决你提到的双重请求问题.
const fromRest$ = myRestService.getDataFromServer().share();
const fromForage$ = ...;
data$ = Observable.merge(
fromRest$,
fromForage$.takeUntil(fromRest$)
);
我的具体情况是我想 运行 localforage 和 rest 端点之间的缓存竞争,如下所示:
- 开始请求资源
- 如果 localforage 在休息前 returns,向订阅者发出信号
- 当休息 return 秒时,向订阅者发出信号
- 如果在 localforage 之前休息 returned,则不要发出 localforage 响应信号。
这里的想法是,在大多数情况下,localforage 会有一些可能是过时的数据,可以非常快速地 returned,但是当 rest 端点请求时,数据将被更新完成。我可以对这两个流进行合并,假设 localforage 将始终 return 在其余请求之前(一个并非不合理的假设,但仍然是一个假设)。问题是,如果休息响应是权威的并且由于某种原因比 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() 或其他东西,或者合并两个流但如果两个流之一完成则完成合并流的运算符(但如果另一个流完成则不完成)。
我可以 代替 fiddle 使用自定义可观察对象 and/or 主题,只处理在封闭范围内保存状态,然后让我在这里使用普通的旧逻辑。
一个简单的 merge
结合 takeUntil
应该可以做到 - 也只是 share
休息电话,应该解决你提到的双重请求问题.
const fromRest$ = myRestService.getDataFromServer().share();
const fromForage$ = ...;
data$ = Observable.merge(
fromRest$,
fromForage$.takeUntil(fromRest$)
);