如何清除/清除rxjs中SubjectReplay实例的缓存?

时间:2018-06-22 22:36:59

标签: stream rxjs

我有一个SubjectReplay,我想将其重置为没有缓存值,因此在重置之后,下一个订阅者将无法获取历史记录?

示例

  • 新主题重播
  • subject.next(1)
  • 重置主题<-这个问题
  • subject.subscribe()//不应收到1

我该怎么做?我需要主题是同一实例。

2 个答案:

答案 0 :(得分:0)

您可能希望结合使用特殊值和filter运算符来获得与您要达到的目标接近的东西。

让我们举一个简单的例子。

您只想重播最后一个值,而null是代表重置的特殊值。代码是

const rs = new ReplaySubject<any>(1); // replay the last value
const rsObs = rs.asObservable().pipe(filter(d => d !== null));
rs.next(1);
rs.next(2);

setTimeout(() => {
    console.log('first subscription');
    rsObs.subscribe(console.log)  // logs 2 on the console
}, 10);


setTimeout(() => {
    rs.next(null);
}, 20);


setTimeout(() => {
    console.log('second subscription');
    rsObs.subscribe(console.log)  // nothing is logged
}, 30);

答案 1 :(得分:0)

满足您需求的最佳方式

  

我需要主题是同一实例

将具有以下可观察值:

// This is your input
const source$: Observable<T>;

const proxy$ = new ReplaySubject<T>(n);
const reset$ = new BehaviorSubject<number>(0);

现在很重要的一点是,在您发布source$之前,请仔细阅读以下内容:

source$.pipe(timestamp()).subscribe(proxy$);

然后,最后,您可以像这样公开数据:

const data$ = proxy$.pipe(
  withLatestFrom(reset$),
  filter(([timedItem, resetTimestamp]) => timedItem.timestamp > resetTimestamp),
  map(([timedItem]) => timedItem.value),
);

您现在可以使用reset$.next(+new Date())来触发重置。


如果可以确保为source$提供带有时间戳的值,则可以跳过proxy$