为什么 rxjs debounceTime 不适用于使用“of”运算符创建的可观察对象?

kma*_*oor 4 rxjs debouncing angular rxjs6

使用angular 7rxjs 6

<input (input)="onChange($event.target.value)">
Run Code Online (Sandbox Code Playgroud)

为什么以下不去抖动?

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

但这确实:

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

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


onChange(val: string) {   
  this.searchTerm$.next(val);
}
Run Code Online (Sandbox Code Playgroud)

mar*_*tin 7

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

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