別のストリームの出力に基づいてストリームをキャンセル/無視/中断する方法はありますか?
ユースケースは、3 つのストリームがあることです。
- loginStream - ユーザーがログイン資格情報を入力し、送信をクリックします。ログイン資格情報を発行します。
- authorizeStream- システムはユーザーの承認を試みます。トークンを発行します。
- logoutStream - ユーザーがログアウト ボタンを押す
一般的なケースは、ユーザーがログインし、システムが認証を試み、将来のある時点でユーザーがログアウトするというものです。ごく普通のFRPです。
Common case
loginStream: -------------------o---->
authorizeStream: ---------------a-------->
logoutStream: ---------l-------------->
エッジ ケースは、ユーザーがログインしても、承認される前にすぐにログアウトする場合です。
Edge case
loginStream: -------------------o---->
authorizeStream: --------a---------------> //ignore/cancel/interrupt this event
logoutStream: -------------l---------->
システムが異常な状態にならないようにするために、この特定のケースでは承認ストリームを無視する必要があります。私が考えることができる唯一のことは、(1) 3 つのストリームをマージする、(2) スキャンを介して状態を追跡する、(3) ログアウトで状態を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'))
上記のアプローチは機能するはずですが、authorizationStream を無視する、よりクリーンで「より FRP」な方法があるかどうか疑問に思っています。