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