функция обратного вызова вызывается до завершения запроса

#javascript #angular #typescript

#javascript #angular #typescript

Вопрос:

У меня есть кнопка like, похожая на ту, что есть в Twitter, которая вызывает функцию, которая обрабатывает запросы, и в функции обратного вызова, которая увеличивает количество лайков и изменяет значение liked bool на true, а кнопка меняется на unliked button, проблема в том, что если я быстро нажал кнопку like, количество лайков уменьшилось.количество лайков увеличивается и уменьшается больше, чем у одного разрешенного пользователя

Я попытался установить задержку на 1 секунду внутри функции обратного вызова и вне ее, но это не дало наилучшего эффекта

 likeDecision(kweek: Kweek): void {
    // not in my profile
    if (this.callCommonFunc) {
      this.kweekFunc.like(kweek);
      return;
    }
    // in my profile
    this.kweekService.likeKweek(kweek.id).subscribe(() => {
      this.likeCallBack(kweek);
    });
  }

  likeCallBack(kweek: Kweek): void {
    this.kweeks.forEach(loopKweek => {
      if (loopKweek.id === kweek.id) {
        loopKweek.liked_by_user = true;
        loopKweek.number_of_likes  ;
      }
    });
  }

  unlikeDecision(kweek: Kweek): void {
    // not in my profile
    if (this.callCommonFunc) {
      this.kweekFunc.unlike(kweek);
      return;
    }
    // in my profile
    this.kweekService.unlikeKweek(kweek.id).subscribe(() => {
      this.unlikeCallBack(kweek);
    });
  }

  unlikeCallBack(kweek: Kweek): void {
    this.kweeks.forEach(loopKweek => {
      if (loopKweek.id === kweek.id) {
        loopKweek.liked_by_user = false;
        loopKweek.number_of_likes--;
      }
    });
  }
  

Я хочу нажимать так быстро, как хочу, и функция обратного вызова вызывается только после завершения запроса

это http-запрос, который я использую в like:

 likeKweek(id: string): Observable<any> {
return this.http.post<any>(`${this.base}kweeks/like`, { id: id }).pipe(
  map(res => res),
  catchError(this.handleError)
);
}
  

Комментарии:

1. почему бы не использовать async / await?

2. Вы можете улучшить больше, добавив обработчик отмены. davidwalsh.name/javascript-debounce-function

3. Вы должны отключить кнопки like / unlike при выполнении запросов в первую очередь.

4. Я новичок в angular, не могли бы вы более подробно объяснить, как этого добиться?

5. Я добавил HTTP-запрос к вопросу

Ответ №1:

Я думаю, вы можете использовать логическое значение, чтобы проверить, выполняете ли вы все еще последний запрос. например, вы можете использовать следующий алгоритм.

 like ( ) {
     if(!busy) {
        busy = true;
        requestfunc => {
            set likes; 
            busy = false;
        }
    }
}