为什么rxjs debounceTime在使用'of'运算符创建的可观测对象上不起作用?

时间:2019-01-11 22:42:49

标签: angular rxjs rxjs6 debouncing

使用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);
}

2 个答案:

答案 0 :(得分:2)

这不是因为of()。在第一个示例中,每次调用onChange($event.target.value)时,您都在使用自己的debounceTime和自己的计时器创建一个新链。因此,它绝不会消除任何反跳,因为每个输入更改都有自己的链。

但是,如果您使用Subject(例如在第二个示例中)并通过this.searchTerm$.next(val)推送所有事件,则只有一个链,其中每个事件都在顶部推送,然后按您期望的方式反跳。

答案 1 :(得分:0)

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