#angular #promise #debounce
Вопрос:
У меня есть метод в сервисе, который возвращает обещание, выполненное, когда пользователь отправляет форму.
Проблема в том, что, когда пользователь нажимает x раз, он пропускает x экранов.
Я ищу оператора времени отмены, но он работает только на наблюдаемом. Здесь у меня есть Обещание.
Есть какие-нибудь предложения, пожалуйста ?
goToNextRoute = (queryParams?: Params): Promise<boolean> =>
this.routeRecursive(this.getNextRoute, queryParams);
Комментарии:
1. Как насчет использования наблюдаемого и, следовательно
debounceTime
, того, что поставляется с angular в любом случае…
Ответ №1:
Либо вы можете реализовать свою собственную функцию отмены
function debounce(f, interval) {
let timer = null;
return (...args) => {
clearTimeout(timer);
return new Promise((resolve) => {
timer = setTimeout(
() => resolve(f(...args)),
interval,
);
});
};
}
ИЛИ вы можете использовать функцию отмены из lodash
https://lodash.com/docs/4.17.4#debounce
_.debounce(somethingThatReturnsAPromise, interval, {
leading: true,
trailing: false
})
Ответ №2:
/** Emits everytime the user clicks*/
private goToNextRouteClick = new Subject<Params | undefined>();
constructor(){
this.goToNextRoute.pipe(debounceTime(TIME)).subscribe( params =>
this.routeRecursive(this.getNextRoute, queryParams) )
}
/** Callback to goToNextRoute button*/
public goToNextRoute = (queryParams?: Params) => this.goToNextRoute.next(queryParams);
Я не знаю о вашем коде, но вам, возможно, следует отписаться в ngOnDestroy()