angular - 在自动保存场景中以哪个顺序使用哪些 rxjs 运算符
问题描述
我想在 Angular 中使用 RxJS 自动保存表单。表单更改时会发出一个事件
这是场景:
当表单输出发生变化,但在接下来的 10 秒内没有再次变化时,它应该发出一个保存事件。
仅当表单每 10 秒更改一次以上(至少 30 秒)时,它也应该发出一个保存事件。
首先我可以使用去抖动,但我如何将它与我的第二条规则结合起来?
解决方案
您需要将流分成两个流。
const source = fromEvent(document.getElementById("text"), "input");
source
.pipe(debounceTime(10 * 1000))
.subscribe(() => console.log("saved after typing!"));
source
.pipe(
auditTime(10 * 1000)
)
.subscribe(() => console.log("saved while typing!"));
在第一种情况下,正如您在问题中所写,使用 debounceTime 值将在用户完成编辑表单/输入后 10 秒发出。在第二种情况下,每 10 秒 auditTime 将检查是否有任何新值。如果有,则将发出值。在回调中,您可以重用负责从表单保存数据的相同函数。您可以在 stackblitz 上的这个演示中尝试它:
https://stackblitz.com/edit/rxjs-jj3kot?file=index.ts
我只是将演示中的时间更改为 1 秒,以便更容易在控制台中检查结果。
边注:
这是一个简单的 JS 演示。如果您开发 Angular 应用程序,您应该避免使用 getElementById 获取元素。而不是直接引用模板:https ://angular.io/api/core/ViewChild
编辑:
根据 OP 评论,我已经稍微改变了实现。我合并了两个 observables 并使用 distinctUntilChanged 运算符来避免两次发出相同的值。stackblitz 中的 Demo 也发生了变化
const afterTyping = source.pipe(debounceTime(1000));
const whileTyping = source.pipe(auditTime(1000));
merge(whileTyping, afterTyping)
.pipe(distinctUntilChanged())
.subscribe(console.log);
推荐阅读
- microsoft-teams - 用户登录团队时如何直接从 Microsoft Teams 获取令牌
- python - 如何识别公共假期
- python - Google Speech Recognition API 输出错误,不确定为什么会发生
- laravel-5.8 - 如何在laravel登录刀片中加密用户名和密码
- reactjs - 加载一个svg文件而不修改webpack中的react
- flutter - 如何使用多提供商更改主题?
- excel - 如何正确转置?
- firebase - 如何通过 UID 从 Firebase 访问用户?
- azure - 使用数组中的元素加入流分析
- apache-spark - 如何在 Pyspark 中过滤数组列值