Как игнорировать новые значения в Observer во время выполнения - PullRequest
0 голосов
/ 10 января 2019

У меня есть тема. И один наблюдатель подписался на это. Как опустить все вызовы Observer, если он уже обрабатывает один?

var subject = new Subject();
var observer = {
        next: x => {
            //... some long processing is here
            console.log('Observer got a next value: ' + x)
        }
    };
subject.subscribe(observer);
subject.next(0);
subject.next(1);// <-- if 0 value is not processed in the observer then skip it
subject.next(2);// <-- if 0 value is not processed in the observer then skip it

Я причины могу ввести некоторое значение flag, установить его в Observer перед выполнением и очистить после. И применить оператор фильтра, как это:

var subject = new Subject();
var flag = true;
var observer = {
    next: x => {
        flag = false;
        //... some long processing is here
        console.log('Observer got a next value: ' + x)
        flag = true;
        }
    };
subject.filter(() => flag).subscribe(observer);
subject.next(0);
subject.next(1);// <-- if previous value is not processed in the observer then skip it 
subject.next(2);// <-- if 0 value is not processed in the observer then skip it

Но я считаю, что существует более изящный и эффективный способ добиться этого.

1 Ответ

0 голосов
/ 10 января 2019

Используйте оператор exhaustMap вместо того, чтобы пытаться свернуть свое собственное противодавление. Он предназначен для игнорирования новых событий при ожидании завершения текущего.

const clicks = fromEvent(document, 'click');
const result = clicks.pipe(
  exhaustMap((ev) => interval(1000).pipe(take(5))),
);
result.subscribe(x => console.log(x));
...