我有一个SubjectReplay,我想将其重置为没有缓存值,因此在重置之后,下一个订阅者将无法获取历史记录?
示例
我该怎么做?我需要主题是同一实例。
答案 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$
。