【问题标题】:BehaviorSubject subscription with debounce带去抖动的 BehaviorSubject 订阅
【发布时间】:2020-08-16 10:16:23
【问题描述】:

我有 BehaviorSubject 属性

public results$ = new BehaviorSubject(null);

假设我订阅了这个

this.results$.subscribe(() => this.find());

每次在输入元素内按键盘上的任意键时都会调用订阅。因此,为了防止对服务器的许多请求,我添加了 debounceTime()

this.results$
   .pipe(debounceTime(500))
   .subscribe(() => this.find());

但我需要立即调用第一个 this.find() 而不进行任何反跳。

我该怎么做?

【问题讨论】:

    标签: angular rxjs behaviorsubject


    【解决方案1】:

    我建议您使用throttleTime 而不是 debounceTime。它传播第一个值,然后等待指定的时间。

    还将BehaviorSubject 更改为Subject

    公开结果$ = new Subject();

    this.results$
       .pipe(
             filter(value => !!value && value.length >= 3),
             throttleTime(500))
       .subscribe(() => this.find());
    

    请在此处阅读有关 throttleTime、auditTime 和 debounceTime 的信息 - https://rxjs-dev.firebaseapp.com/guide/operators

    【讨论】:

    • 我在这里需要 BehaviorSubject 因为我只是在这里放了一部分代码。throttleTime 的工作方式有点不同我有一个输入字段用户可能会在没有任何暂停的情况下按下按钮。然后如果输入之间有超过 500 毫秒的暂停,我们应该发送一个请求另外我会在这里添加更多条件 .pipe(skipWhile((key) => key.length =3 时发送请求以查找某些内容这里的主要问题是用户输入了 2 个符号,它不搜索
    • 用户输入第三个符号,等待 500 毫秒,然后搜索。我只需要在“3”时立即搜索,然后在 500 毫秒暂停后搜索
    • 根据您的要求更新了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多