在 angular 中去抖一个函数

debounce a function inside angular

我想为函数内的参数添加去抖动

我遇到问题是因为 Angular 去抖动仅适用于管道和可观察对象,所以我改用 lodash 去抖动。

每当清晰度数据网格table刷新时,它会调用onRefreshTable函数并传递具有table过滤和排序状态的事件对象。

由于 refreshTable() 将调用 API 这需要更长的时间,我想尽量减少 API 调用。

有时 table 使用相同参数或不同参数多次调用刷新。如果参数不同,最后的 table 刷新调用将包含所有需要的参数以传递给 API.

我的尝试在代码中没有错误,但它仍然在 1 秒后使用相同的参数调用函数几次,

import * as _ from lodash;
onRefreshTable(event: ClrDatagridStateInterface<any>) {
        _.debounce((event) => {
            this.refreshTable(event)
        }, 1000);     
}
refreshTable(event) {
   // save state to the rxjs store 
   // call API which is expensive
}

我正在考虑使用 distinctUntilChanged,但它似乎不适用于这种情况,因为函数内的参数是不可观察的。

也许我应该使用 _.cloneDeep 来比较之前的参数和当前的参数?

可以用distinctUntilChanged(_.isEqual),有参考价值的可以这样传***.next(JSON.parse(JSON.stringify(customerSearchInfo)))

代码sinppet:

  customerSearchQuery = new Subject<CustomerQueryInfo>();
  customerSearchQuery$ = this.customerSearchQuery.pipe(
    map(queryInfo => {
      queryInfo.keyWord = queryInfo.keyWord.trim();
      return queryInfo;
    }),
    debounce(queryInfo => {
      if (queryInfo.skip > 1 || queryInfo.keyWord === '') {
        return interval(0);
      }
      return interval(800);
    }),
    distinctUntilChanged(_.isEqual),
    switchMap(queryInfo => this.scmContext.BA_Customers.GetPage(queryInfo).Execute())
  );