【问题标题】:Why rxjs debounceTime does not work on observables created using 'of' operator?为什么 rxjs debounceTime 不适用于使用“of”运算符创建的可观察对象?
【发布时间】:2019-06-06 21:02:03
【问题描述】:

使用angular 7rxjs 6

<input (input)="onChange($event.target.value)">

为什么以下内容不反跳?

onChange(val: string) {
  of(val)
    .pipe(        
      debounceTime(300)        
  ).subscribe(valx => {
    console.log(valx);
  });
}

但这确实:

  searchTerm$: Subject<string> = new Subject();

  this.searchTerm$.pipe(      
    debounceTime(300),    
  ).subscribe(val => {
   console.log(val);
  });


onChange(val: string) {   
  this.searchTerm$.next(val);
}

【问题讨论】:

  • 怎么不行?它没有记录任何东西还是没有去抖动?
  • @NunoSousa,我已经编辑了这个问题,但它没有反跳。

标签: angular rxjs rxjs6 debouncing


【解决方案1】:

考虑你的逻辑。您将为每个 onChanges 创建一个最终的观察者。它不会去抖动,因为观察者已经完成,并且去抖动是为了防止发射一个,以防另一个出现。因此,它至少需要 两次 发射是合理的(或更多),如果观察者是在回调中创建的,则不会发生这种情况。

【讨论】:

  • 这是正确的答案,因为它不能消除任何已经完成的东西!
【解决方案2】:

这不是因为of()。在您的第一个示例中,每次调用 onChange($event.target.value) 时,您都会创建一个具有自己的 debounceTime 和自己的计时器的新链。所以它永远不会去抖动任何东西,因为每个输入更改都有自己的链。

但是,如果您使用 Subject(如在第二个示例中)并通过 this.searchTerm$.next(val) 推送所有事件,那么您只有一个链,其中每个事件都被推送到顶部,然后按照您的预期去抖动。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-02
    • 1970-01-01
    • 2018-10-17
    • 2021-01-15
    • 1970-01-01
    • 2020-07-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多