1

別のストリームの出力に基づいてストリームをキャンセル/無視/中断する方法はありますか?

ユースケースは、3 つのストリームがあることです。

  1. loginStream - ユーザーがログイン資格情報を入力し、送信をクリックします。ログイン資格情報を発行します。
  2. authorizeStream- システムはユーザーの承認を試みます。トークンを発行します。
  3. 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」な方法があるかどうか疑問に思っています。

4

2 に答える 2

2

loginこのストリームは、 の後と の前にのみ放出されますlogout

loginStream.flatMapLatest(() => {
    return authorizeStream.take(1).takeUntilBy(logoutStream);
})

場合によっては、.take(1)一部を省略して 1 回のログインで複数の認証を許可することもできます

于 2016-04-11T13:41:52.723 に答える