2017-09-14 4 views
0

Plusieurs écouteurs d'effets doivent être exécutés jusqu'à ce que l'utilisateur se déconnecte. En tant que tel, j'essaie de mettre en œuvre OnRunEffects.Présentation de Ngrx OnRunEffects

Un segment de mes user.actions.ts est:

export const LOAD_USER = '[Users] Load User'; 

export class LoadUser implements Action { 
    readonly type = LOAD_USER; 
} 

export type UserActions = LoadUser; 

Je suis en train de mettre en œuvre OnRunEffects comme:

ngrxOnRunEffects(resolvedEffects: Observable<EffectNotification>) { 
    return this.actions 
       .ofType(UsersActions.LOAD_USER) 
       .exhaustMap(() => resolvedEffects.takeUntil(AuthActions.LOGOUT_SUCCESS) 
} 

Cependant, takeUntil se plaint qu'il a besoin que Observable. J'ai donc essayé:

ngrxOnRunEffects(resolvedEffects: Observable<EffectNotification>) { 
     return this.actions 
        .ofType(UsersActions.LOAD_USER) 
        .exhaustMap(() => resolvedEffects.takeUntil(
         Observable.of(new AuthActions.LogoutSuccess()) 
        ) 
    } 

Cela à son tour, provoque l'effet de ne pas déclencher. De la lecture du code, on dirait qu'il déclare:

  1. Quand vous voyez ces actions
  2. exécuter les effets
  3. jusqu'à ce que vous voyez cette autre action.

Qu'est-ce que je fais mal?

+0

pourquoi ne pas simplement utiliser 'filter'? Dans votre effet, 'ofType <>(). Filter (EST-CE QUE L'UTILISATEUR EST CONNECTÉ)' – Maxime

+0

Exemple s'il vous plaît? – Brandon

+0

J'ai fait une bonne réponse, pas sûr que cela corresponde à votre cas d'utilisation mais pourrait aider – Maxime

Répondre

0

-moi si je me trompe Si oui, au lieu de penser à takeUntil, mais vous ne voulez pas run until the user has logged out, vous pourriez vouloir exécuter ces effets si l'utilisateur est toujours connecté:

@Effect() 
someEffect$: Observable<Action> = this.actions$ 
    .ofType<Your_Type>(Your_Action) 
    .withLatestFrom(this.store$.select(state => state.users.isUserLoggedIn)) 
    .filter(([action, isUserLoggedIn]) => isUserLoggedIn) 
    // here, you'll receive the actions only is the user is logged in 
    // ... your code for the effect 
.
+0

Très intéressant. Merci pour la réponse. Je devrais pouvoir essayer aujourd'hui. – Brandon

+0

De rien. Comme vous êtes intéressé par ngrx, je vous recommande de jeter un oeil dans un modèle (basé sur angulaire-cli) sur lequel j'ai travaillé :) Beaucoup de commentaires pour expliquer les choses + readme https://github.com/maxime1992/angular-ngrx-starter Laissez-moi savoir comment ça se passe après avoir essayé ma proposition :) – Maxime

0

Essayez ceci:

ngrxOnRunEffects(resolvedEffects: Observable<EffectNotification>) { 
    return this.actions 
     .ofType(UsersActions.LOAD_USER) 
     .exhaustMap(() => resolvedEffects.takeUntil(this.actions.ofType(AuthActions.LOGOUT_SUCCESS))) 
} 

Documentation ont été mis à jour: https://github.com/ngrx/platform/commit/4b606d581d18866576b9632b0537953c2b6006c4

+0

Lorsque j'ajoute ce code à mes classes Effect, il semble empêcher '.startWith()' de se déclencher correctement. – Brandon

+0

Il ne se déclenche pas après l'action LOAD_USER? – bbaia

+0

Correct. L'effet ne démarre jamais si j'implémente onRunEffects, où il l'a fait précédemment. – Brandon