我有一个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);