2

ディスパッチ アクションとストアの間のミドルウェアとして機能する redux-observable を使用しています。これを達成するためにrxjssample関数を使用しようとしていますが、残念ながらうまくいきません。これが私の叙事詩です:

export const inviteUserEpic = (action$) => {
    return action$.ofType(a.INVITE_USER)
    .flatMap(({ body }) => {
        return Observable.concat(
            Observable.of({ type: authActions.REGISTER_REQ, body }),
            Observable.of(push(`/team/${body.teamId}`))
            .sample(action$.ofType(authActions.REGISTER_SUCCESS))
        );
    });
};

基本的には、新しいユーザーを登録する場所が複数あるという考え方です。この場合、ユーザーの登録に成功した後、チーム ページにリダイレクトしたいと考えています。REGISTER_REQ が出力され、その後 REGISTER_SUCCESS が出力されます。ただし、リダイレクト オブザーバブルはサンプリングされません。

4

1 に答える 1

2

これはsample、ソース自体がまだアクティブである場合にのみ、オペレーターがアクティブで通知機能をサブスクライブしているためです。この場合、ソースはObservable.of()提供されたアクションを発行し、すぐcomplete()に を発行する です。つまり、何もサンプリングしなくなります。つまり、アクションがディスパッチさcomplete()れる前です。REGISTER_SUCCESSつまり.sample()、オブザーバブル チェーンの完了を妨げません。

代わりに、期待されるアクションを照合することから始めて、一致したときにそれをpush(). おそらく、無期限ではなく一度だけリッスンしたいREQUEST_SUCESSので、追加する必要があります.take(1)

action$.ofType(authActions.REGISTER_SUCCESS)
  .take(1)
  .map(() => push(`/team/${body.teamId}`))

それを既存の Epic と組み合わせる

export const inviteUserEpic = (action$) => {
    return action$.ofType(a.INVITE_USER)
    .flatMap(({ body }) => {
        return Observable.concat(
            Observable.of({ type: authActions.REGISTER_REQ, body }),
            action$.ofType(authActions.REGISTER_SUCCESS)
              .take(1)
              .map(() => push(`/team/${body.teamId}`))
        );
    });
};

これの実例をここで見ることができます: http://jsbin.com/sonuqob/edit?js,output

于 2016-11-03T23:59:53.437 に答える