Rxjs подписка только на последний запрос

Как правильней и лучше всего реализовать подписку только на последний запрос? Например:

  1. Отправляем запрос. Он обрабатывается долго.
  2. Отправляем повторно второй запрос и получаем сразу ответ. Обрабатываем его в subscribe.
  3. Вдруг прилетает ответ на первый запрос и его уже обрабатывать не нужно.

Сделал так (вырезка из Angular)

private lastRequestTime = Date.now();
getData() {
  const date = Date.now();
  this.lastRequestTime = date;
  this.dataService
    .getData()
    .pipe(
      takeWhile(() => this.lastRequestTime === date),
    )
    .subscribe(response => {
      // do something
    });
}

Но думаю есть более лаконичный подход. Как правильней?


Ответы (2 шт):

Автор решения: user447630

Если вам необходимо отлавливать последний запрос воспользуйтесь Debounce

https://rxjs.dev/api/operators/debounce

→ Ссылка
Автор решения: Yugofx

Вообще стандартная стратегия HttpClient - это канселить PENDING REQUEST. Если это какая-то своя тема на rxjs, то простого take(1) будет достаточно, если надо только первое значение из стрима. Опять же, если ваша getData состоит из пачки разных запросов, и нужен только первый, можно заюзать race.

return race(
  timer(5000).pipe(mapTo('slow')),
  timer(2000).pipe(mapTo('faster')),
  timer(1000).pipe(mapTo('fastest')) // подписка создастся только на этот стрим, остальные игнорятся
)
→ Ссылка