Как я могу сбросить аккумулятор сканирования на ReplaySubject? - PullRequest
0 голосов
/ 27 апреля 2018

У меня есть 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'));

1 Ответ

0 голосов
/ 27 апреля 2018

Я задал очень похожий вопрос несколько дней назад, а потом ответил сам

накапливаются значения, например, при сканировании, но с возможностью сброса аккумулятора с течением времени

Может быть, это может помочь вам

НЕКОТОРЫЕ БОЛЬШЕ ДЕТАЛЕЙ

Альтернативный подход состоит в том, чтобы иметь Observable, который действует как таймер , который излучает с фиксированным интервалом, 10000 мс в вашем случае.

Когда этот таймер срабатывает , вы передаете управление в Observable, который накапливается через оператор scan. Чтобы передать управление, вы используете оператор switchMap, чтобы убедиться, что предыдущий экземпляр Observable завершен.

Если я правильно понимаю, чего вы хотите достичь, я бы использовал обычный Subject, а не 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);
...