如何在ReplaySubject上重置扫描累加器?

时间:2018-04-27 09:43:27

标签: rxjs reactivex subject

我有scanlet 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();
}

1 个答案:

答案 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);