rxjs - 使用 RxJS 的可暂停缓冲区
问题描述
我正在尝试使用 RxJS 流实现可切换的自动保存功能。目标是:
- 启用自动保存后,将更改发送到服务器。
- 禁用自动保存时,缓冲更改并在重新启用自动保存时将其发送到服务器。
这是我遇到的:
autoSave$ = new BehaviorSubject(true);
change$ = new Subject();
change$.pipe(
bufferToggle(
autoSave$.pipe(filter(autoSave => autoSave === false)),
() => autoSave$.pipe(filter(autoSave => autoSave === true)),
),
concatMap(changes => changes),
concatMap(change => apiService.patch(change)),
).subscribe(
() => console.log('Change sent'),
(error) => console.error(error),
);
感谢bufferToggle
,我能够在autoSave
关闭时缓冲更改并在重新启用时发送它们。
问题是虽然autoSave
启用,但没有任何东西通过。我理解这是因为bufferToggle
忽略了流来,而其开放的 observable 没有发出。
我觉得我应该有一个条件来绕过启用的bufferToggle
时间autoSave
,但我所有的尝试都惨遭失败。
有什么想法可以实现吗?
解决方案
我们可以在 autosave on和off using之间缓冲事件,并在off和on usingbufferToggle(on, off)
之间打开一个过滤窗口。然后我们将它们合并在一起:windowToggle(off, on)
const on$ = autoSave$.filter(v=>v);
const off$ = autoSave$.filter(v=>!v);
const output$ =
Observable.merge(
changes$
.bufferToggle(
off$,
()=>on$
)
changes$
.windowToggle(
on$,
()=>off$
)
)
.flatMap(x=>x) // < flattern buffer and window
在https://thinkrx.io/gist/3d5161fc29b8b48194f54032fb6d2363上玩这个例子
*请注意,由于缓冲区将值包装在数组中 - 我flatMap(v=>v)
在示例中使用了另一个来解包缓冲值。您可能希望禁用此特定行以从混合了原始值的缓冲区中获取数组。
此外,请查看我的文章“ RxJS 中的可暂停可观察对象”以查看更多示例。
希望这可以帮助
推荐阅读
- c# - 如何获得 T 泛型的类型?
- gcc - avr-gcc 8.1.0 使用 `as` 而不是 `avr-as`
- javascript - jQuery - 设置一个输入等于另一个输入的 5% 和更多 1
- babeljs - babel-preset-env 中的浏览器目标到底是做什么的?
- javascript - 如何使用 vuejs2 从另一个组件执行函数
- python-3.x - ValueError:来自从函数返回并转换为 int 的值
- loops - 有没有办法告诉编译器我正在循环管理变量的所有权?
- constructor - 将强制性数据传递给 Kotlin 中的超类
- java - Java - 在 string.replace() 问题中有字符输入
- java - Kafka 代理 JVM 设置低于 1GB