首页 > 解决方案 > 如何在执行期间忽略 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

但我相信存在更优雅和有效的方式来实现这一目标。

标签: rxjsrxjs6

解决方案


使用exhaustMap运算符而不是尝试滚动您自己的背压。它旨在在等待当前事件完成时忽略新事件。

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

推荐阅读