Почему вторая карта SwitchMap не может быть отменена
Оператор switchMap
отменяет свою внутреннюю наблюдаемую только тогда, когда он получает следующее событие от своей восходящей наблюдаемой (т. Е. makeRequest1
), а не когда излучает исходная наблюдаемая (то есть buttonClicked$
). Итак, рассмотрим следующую последовательность событий:
first button click
first request 1 sent
first response to request 1 received
first request 2 sent
second button click
second request 1 sent
first response to request 2 received
second response to request 1 received
В этом сценарии, поскольку ответ на запрос 2 получен до того, как будет получен второй ответ на запрос 1, хотя второе нажатие кнопки произошло до того, как запрос 2 завершен, запрос 2 никогда не отменялся.
Если запрос 1 отправляет свой второй ответ до того, как запрос 2 получит ответ, то запрос 2 отменяется. Но обратите внимание, что это отменило не само нажатие кнопки, а отмена запроса 1, который отменил его.
Решение
Если вы хотите надежно отменить оба запроса при нажатии кнопки, то оба запроса должны быть выполнены в пределах одного switchMap
:
buttonClicked$.pipe(
switchMap(clickValue => makeRequest1(clickValue).pipe(
mergeMap(request1Value => makeRequest2(request1Value)))
).subscribe(request2Value => /* ... */);