Когда последний запрос?
В какой момент времени вы определяете, какой будет последний запрос?
Вам нужно будет collect
каждый клик, который делает пользователь, и в какой-то другой момент выполнить запрос. но это кажется довольно странным
Каждый наблюдаемый http-запрос будет завершен после завершения самого запроса. Если у вас нет перекрывающихся запросов, switchMap
ничего не сделает, потому что нечего переключать.
Вы можете проверить это, если добавите задержку
см. https://stackblitz.com/edit/rxjs-about-switchmap-jhy3v4
Если вы добавите задержку к вашему запросу для имитации задержки, вы получите результат, который вы ожидаете получить от switchMap
Без задержки ваш запрос будет настолько быстрым, что он будет выполнен, как только вы нажмете снова, и ничего не будетпереключаться, потому что внутренняя наблюдаемая уже завершена, поэтому вы получаете все результаты, потому что это новый поток событий.
Вот почему, например, last
или takeLatest
здесь не помогут.
Вот что я хотел бы
https://stackblitz.com/edit/rxjs-about-switchmap-jhy3v4
В кнопке с проверкой идентификатора я бы использовал debounceTime
в сочетании с switchMap
и включением / выключением кнопки
const click3$ = fromEvent(document.querySelector('#test'), 'click');
switchMapExample2$.subscribe((val) => {
console.table(val);
});
const button = document.querySelector('#test');
const switchMapExample3$ = click3$.pipe(
tap(() => button.setAttribute('disabled', 'disabled')),
debounceTime(500),
tap(() => console.log('inside switchMap - click happend')),
switchMap(() => {
console.log('inside switchMap - start http request');
return httpCall$.pipe(
tap((val) => console.log('inside switchMap - http response ', val))
);
}));
switchMapExample3$.subscribe((val) => {
console.table(val);
button.removeAttribute('disabled');
});
Просто помните о RxJS: Избегайте ошибок, связанных с switchMap , опубликованных Олесом Савлуком.