отменить функцию внутри angular

#rxjs #lodash #angular8 #debounce #rxjs-pipeable-operators

#rxjs #Lodash #angular8 #отмена #rxjs-конвейерные операторы

Вопрос:

Я хотел бы добавить отмену для аргумента внутри функции

У меня возникла проблема, потому что Angular debounce работает только для pipe и observable, поэтому я использую Lodash debounce вместо этого.

всякий раз, когда таблица clarity datagrid обновляется, она вызывает функцию onRefreshTable и передает объект события, который имеет табличный фильтр и состояние сортировки.

Поскольку refreshTable() будет вызывать API, что занимает больше времени, я хотел бы свести к минимуму вызов API.

Иногда обновление таблицы вызывается несколько раз с одним и тем же аргументом или с другим аргументом. Если другой аргумент, последний вызов обновления таблицы будет содержать все необходимые аргументы для передачи в 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 вместо этого для сравнения предыдущих аргументов с текущими аргументами?

Ответ №1:

Вы можете использовать distinctUntilChanged(_.isEqual) , и если у вас есть ссылочное значение для сравнения, передавая ***.next(JSON.parse(JSON.stringify(customerSearchInfo))) его следующим образом.

Ошибка кода:

   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())
  );