rxjs - 如何在执行期间忽略 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
但我相信存在更优雅和有效的方式来实现这一目标。
解决方案
使用exhaustMap
运算符而不是尝试滚动您自己的背压。它旨在在等待当前事件完成时忽略新事件。
const clicks = fromEvent(document, 'click');
const result = clicks.pipe(
exhaustMap((ev) => interval(1000).pipe(take(5))),
);
result.subscribe(x => console.log(x));
推荐阅读
- jupyter-notebook - jupyter-notebook 修改 config_path 以删除系统范围的路径
- c# - UWP/C# SDK 连接多个云服务
- node.js - package.json `name` 和 `version` 应该放在 JSON 的顶层吗?
- r - 在哪里以及如何在 ggplot 中应用过滤器
- rust - 如何使用 cargo publish 发布优化的二进制文件?
- xampp - 更新到 MacOS Catalina 后 XAMPP 本地主机访问禁止错误 403
- vue.js - 使用多个组件在 Vue Router 中传递 props
- c - strlen AVX-512 __builtin_ctz 无效值
- wordpress - 在 Woocommerce 结帐中隐藏字段中的标签文本
- c++ - 包含点的 C/C++ 宏参数(成员访问运算符)