Угловое обещание времени отмены

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