Обработка отмены асинхронных действий зависит от type и way , которые мы выполняем asyn c action.
Я предполагаю, что тип наших асинхронных действий - это HTTP-запросы. Для этого у нас есть несколько вариантов выполнения реального HTTP-запроса:
- с использованием HttpClient от самого Angular ( самый распространенный случай и лучшая практика! )
- с использованием Ax ios (после этого обертка вокруг Fetch API)
- с использованием Fetch API , предоставляемым самим браузером
HttpClient
При использовании услуги HttpClient
от Angular рекомендуется использовать ее с RxJs
в сочетании. Поэтому в вашем случае я бы вернулся к наблюдаемому решению, которое вы описали выше. Почему?:
- HttpClient сам использует
RxJs
и возвращает Observables в качестве значения по умолчанию RxJs
в сочетании с HttpClient
упрощает отмена текущего запроса с его switchMap оператором - Имейте в виду, что switchMap сам по себе не отменяет HTTP-запрос или сохраняет для него логи c. Он просто вызывает отписаться на подписку внутреннего потока. Лог отмены запроса c обеспечивается реализацией HttpClient (более или менее), который возвращает лог отмены c в обратном вызове отмены подписки.
- К сожалению, не так просто написать правильный код
RxJs
и избежать нескольких или вложенных подписок. В вашем случае я бы попытался создать поток (я полагаю) событий щелчка и использовать: - switchMap , чтобы сгладить поток (сравнимый с
flatMap
) и отписаться от существующего внутреннего поток в случае, если происходит новое событие click. - concatMap для ожидания завершения потока
inventoriesRequest
до создания populateInventoriesRequest
.
this.populateInventoryClicks$
.pipe(
switchMap(() => this.inventoryService.inventoriesRequest()),
concatMap(inventories => this.inventoryService.populateInventoriesRequest(inventories)),
)
.subscribe(response => {
console.log(response);
});
Пожалуйста, взгляните на пример Stackblitz . Отрегулируйте скорость на вкладке сети в консоли разработчика. На вкладке сети мы должны увидеть, что при нескольких нажатиях кнопок выполняется только последний запрос и что все до того, как он был отменен.
Ax ios
При использовании клиента Ax ios мы можем использовать метод cancel
, который он нам предоставляет. Посмотрите на их документацию , если вы заинтересованы в их подходе. Помните, что когда мы используем Ax ios, по этим запросам не будет работать HttpInterceptors из Angular. Это самая очевидная причина, по которой я не знаю, кто ее использует в сочетании с Angular.
Fetch API
Fetch API также дает нам возможность отменить текущий запрос сделано с fetch
. Я не могу рекомендовать этот подход по тем же причинам, по которым я не могу рекомендовать подход Ax ios. Но взгляните , если вам интересно.