2016-11-03 10 views
2

私はredux-observableを使用して、ディスパッチアクションとストアの間のミドルウェアとして動作しています。私はこれを達成するためにrxjs sample関数を使用しようとしていますが、残念ながらそれは私のために働いていません。ここに私の叙事詩だ:他のアクションをlistenするためにredux-observable内のrxjsサンプルを使用

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を放出します。しかし、リダイレクトオブザーバブルは決してサンプリングされません。

答えて

2

これは、sample演算子がアクティブであり、ソース自体がアクティブなときにノーティファイヤーに登録するためです。この場合、ソースは提供されたアクションを発行するObservable.of()であり、即座にcomplete()となり、何もサンプリングされなくなります。REGISTER_SUCCESSアクションが送出される前に既にcomplete()です。すなわち.sample()は、観察可能なチェーンが完了することを妨げません。

代わりに、期待される動作をマッチングさせてから、一致したマップをpush()にマッピングしてください。おそらく、また、あなたはあなたが作業例を参照することができ、既存のエピック

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}`)) 
     ); 
    }); 
}; 

と一緒にそれを置く.take(1)

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

を追加する必要がありますのでだけではなく、無期限に、一度REQUEST_SUCESSをリッスンしたいですhttp://jsbin.com/sonuqob/edit?js,output

+0

@Jake Dluhyおそらく 'REGISTER_SUCCESS'を永遠に聞きたいとは言わなかったのですが、その場合は' .take(1) 'を追加して最初の一致。私はそれに応じて私の答えを編集しました。 – jayphelps

+0

ありがとう!私が思ったもう一つのことは、リクエストが失敗した場合にリダイレクトをキャンセルしたいということです。私は '.takeUntil(action $ .ofType(authActions.REGISTER_FAILURE))'を追加しました。これはうまくいくようです。 –

+0

うん、それは完璧です。 – jayphelps

関連する問題