代码之家  ›  专栏  ›  技术社区  ›  Reactgular

每隔250毫秒发射一次值,类似于deboueTime(),但没有延迟

  •  1
  • Reactgular  · 技术社区  · 7 年前

    我有一个很重的操作,当调整窗口大小时,它会重新排列许多DOM元素。

    所以我一直在使用 debounceTime(250ms) 在更新组件之前创建延迟。除非用户不断调整窗口的大小,否则这会很好地工作。例如,如果我在10秒内非常缓慢地调整窗口的宽度,那么Observable将不会发出任何值。这个 脱粘时间(250毫秒) 仅在250毫秒后发出一个值,没有任何新值。

    我需要一个每250毫秒至少发出1个值的运算符,类似于 debounceTime() 以便用户在调整窗口大小时收到一些反馈。

    下面是一个示例组件:

     @Component({....})
     public class ResizeComponent {
          private readonly widthChange: Subject<number> = new ReplaySubject(1);
    
          public constructor(private elRef: ElementRef<HTMLElement>) {
               this.widthChange.pipe(debounceTime(250)).subscribe((width: number) => {
                  // do resize work here
               });
          }
    
          @HostListener('window:resize')
          public resize() {
               this.widthChange.next(this.elRef.nativeElement.clientWidth);
          }
    }
    

    问题:

    只有当用户停止调整250毫秒的大小后,上面才会处理窗口的大小调整。如何处理每250毫秒的大小调整,以及最后一个大小调整值。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Ploppy    7 年前

    您可以通过组合两个运算符来实现这一点。

    • 采样时间(250)
    • DistinctUntilChanged()。

    observable.pipe(sampleTime(250), distinctUntilChanged(),
    ).subscribe(() => {
      ...
    });