Асинхронщина - это сложно. Асинхронщина с прерываниями в произвольном месте - сложно вдвойне.
"Прям красиво" в конечном коде не получится. Но можно сделать более-менее приличную абстракцию или воспользоваться готовой.
Например можно использовать
@tanstack/vue-query - оно предусматривает большинство возможных сценариев. Из минусов - не до конца изжитое наследство react: некоторые вещи с vue можно было бы сделать лаконичней.
Если хочется своего - абстрагируй во что-то подобное, покрывай тестами и переиспользуй.
Чтоб не было гонок - проверяй актуальность
после каждого await.
Чтоб не было проблем с индикатором загрузки - следует использовать под капотом не логический, а числовой (абстракцию надо оным)
loading++ loading-- loading===0
- если такой "застрянет", значит где-то ошибка в логике.:)
Скрыть(абстрагировать) передачу
AbortSignal
в
axios
можно с помощью интерцептора.
В общем и целом к сожалению в спеках
async
(
Promise
) отмены в красивом виде не предусмотрели.
Есть пример того как хотелось бы чтоб оно работало - "flow" с использованием генераторов (
yield
вместо
async
+ обёртки), которое позволяет остановить всё на любом моменте извне, ничего не пробрасывая и не подготавливая. Однако это костыль, требует всяких уродливых обёрток, не очевидного поведения и плоховато дружит с типизацией.
Я всё порываюсь состряпать какой-нить "DeepCancelablePromise" на магии, и заставить его работать похожим образом, но руки не доходят.:)