2017-03-02 8 views
1

私のアプリはngrxとngrxエフェクトを使用します。ここに私のアプリの効果の一つである:RxJSマップ演算子とngrxエフェクトの連鎖問題

@Effect() 
    reloadPersonalInfo$: Observable<Action> = this.actions$ 
    .ofType(currentUserAccount.ActionTypes.RELOAD_PERSONAL_INFO) 
    .filter(() => <boolean>JSON.parse(localStorage.getItem('authenticated'))) 
    .switchMap(() => 
     this.userAccountService 
     .retrieveCurrentUserAccount() 
     .map(currentUserAccount => new LoadUserAccountAction(currentUserAccount)) 
     .map(() => new SigninAction()) 
    ); 

私は//.map(() => new SigninAction())

をコメントアウトした場合LoadUserAccountActionは除いて私の減速機能を入力していない理由を私は疑問に思って誰が助けてくださいことはできますか?私は間違っていますか?それが効果によって放出されていないため、最終的な.map(() => new SigninAction())が代わりに放出さSigninActionを見ているよう

+0

エフェクトは、1つのアクションのみを返すことを意味します。 – Jim

+0

@Jim:あなたのコメントと編集をありがとう。いくつかのアクションを有効に戻すことを避けるために、アプリのデザインを変更する方法を提案してください。 – balteo

+0

"LoadUserAccountAction"と "SigninAction"の両方を1つのエフェクトで返そうとしています。あなたはもう一方を返すべきです。つまり、コード内の.map行の1つを削除します。 – Jim

答えて

2

はあなたのLoadUserAccountActionは、送出されません。

あなたがちょうどこのようにそれを行う必要があるだろう、効果から複数のアクションを放出することが可能である:

@Effect() 
reloadPersonalInfo$: Observable<Action> = this.actions$ 
    .ofType(currentUserAccount.ActionTypes.RELOAD_PERSONAL_INFO) 
    .filter(() => <boolean>JSON.parse(localStorage.getItem('authenticated'))) 
    .switchMap(() => this.userAccountService 
    .retrieveCurrentUserAccount() 
    .concatMap(currentUserAccount => [ 
     new LoadUserAccountAction(currentUserAccount), 
     new SigninAction() 
    ]) 
); 

両方のアクションがあるようconcatMapオペレータが二つの動作を含む配列を平らにします放出された - 配列内で宣言されている順に表示されます。