Есть ли способ отменить/игнорировать/прерывать поток на основе вывода другого потока?Игнорировать/отменить/прерывать потоки в функциональном реактивном программировании?
Прецедент является то, что у меня есть 3 потока:
- loginStream - пользователь вводит войти кредитки и нажимает кнопку Отправить. Испускает логин.
- authorizeStream-system пытается авторизировать пользователя. Выдает токен.
- logoutStream - пользователи нажимает кнопки выхода
Общий случай --- пользователь входит в систему, система пытается разрешить, в какой-то момент в будущем пользователь выходит из системы. Это довольно стандартный FRP.
Common case
loginStream: -------------------o---->
authorizeStream: ---------------a-------->
logoutStream: ---------l-------------->
Кромка края --- пользователь регистрируется, но сразу же выходит из системы, прежде чем он авторизован.
Edge case
loginStream: -------------------o---->
authorizeStream: --------a---------------> //ignore/cancel/interrupt this event
logoutStream: -------------l---------->
Чтобы система не перешла в странное состояние, мне нужно игнорировать поток авторизации в данном конкретном случае. Единственное, о чем я могу думать, это (1) объединить три потока, (2) состояние трека через сканирование, (3) logout устанавливает состояние в logout
, логин устанавливает состояние в login
. Отфильтруйте событие авторизации, если не в login
.
merge([loginStream, authorizeStream, logoutStream])
.scan((state, event) => event.type !== 'auth' ? {state: event.type, event} : {state, event}, {})
.filter(event => !(event.state !== 'login' && event.event.type === 'auth'))
выше подход должен работать, но мне интересно, если есть пылесос, «более FRP» путь игнорирования authorizationStream.
'flatMapLatest' является' switchMap' в rxjs 5, если я не ошибаюсь. – weltschmerz