我有scan
与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 ms。还有其他办法吗?
现在:
@Autowired
private RemoteService remoteService;
@ShellMethod
public String list(){
List<String> items= remoteService.getAll();
return items.toString();
}
答案 0 :(得分:2)
前几天我问了一个非常相似的问题,后来回答了自己
accumulating values such as with scan but with the possibility to reset the accumulator over time
也许这可以帮到你
更多细节
另一种方法是让Observable充当计时器,在您的情况下以固定的间隔发射10000毫秒。
一旦计时器发出,您将控件传递给通过scan
运算符累积的Observable。要传递控件,请使用switchMap
运算符以确保Observable的上一个实例完成。
如果我理解你想要达到的目标,我会使用普通的主题而不是ReplaySubject。
代码可能看起来像这样
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);