如何在重播主题上重置扫描的累加器?



我有一个ReplaySubject,它用scan运算符累积数据,每 10000 毫秒应该重置一次。还有其他方法可以做到吗?

现在:

let subject = new ReplaySubject();
subject.scan((acc, cur) => {
acc.push(cur);
return acc;
}, [])
.subscribe(events => {
localStorage.setItem('data', JSON.stringify(events))
});
subject
.bufferTime(10000)
.map(() => {
subject.observers[0]._seed = [];
})
.subscribe(() => localStorage.removeItem('data'));

几天前我问了一个非常相似的问题,后来回答了自己

累积值,例如扫描,但随着时间的推移可以重置累加器

也许这可以帮助你

更多细节

另一种方法是使用一个可观察量,它充当计时器,以固定的间隔(在您的情况下为 10000 毫秒)发射。

计时器发出后,将控件传递给通过运算符累积的 Observablescan。若要传递控件,请使用switchMap运算符来确保 Observable 的上一个实例完成。

如果我正确理解你想要实现的目标,我会使用普通的主题而不是重播主题。

代码可能如下所示

const subject = new Subject<number>();
const timer = Observable.timer(0, 1000).take(4);
const obs = timer.switchMap(
() => {
console.log('-----');
return subject
.scan((acc, cur) => {
acc.push(cur);
return acc;
}, []);
}
)
obs.subscribe(
events => {
console.log(JSON.stringify(events))
}
);

// TEST DATA EMITTED BY THE SUBJECT
setTimeout(() => {
subject.next(1);
}, 100);
setTimeout(() => {
subject.next(2);
}, 1100);
setTimeout(() => {
subject.next(3);
}, 2100);
setTimeout(() => {
subject.next(4);
}, 2200);

最新更新