I have an Angular 8 app which uses NgRx 8.3.0
For one of the actions, I need the reducers to execute before the effects, because the effect depends on the reduced state. Does NgRx guarantee that order, or is there a way to force that order?
I have an Angular 8 app which uses NgRx 8.3.0
For one of the actions, I need the reducers to execute before the effects, because the effect depends on the reduced state. Does NgRx guarantee that order, or is there a way to force that order?
Edit:
NgRx effects fire after all reducers for that action have executed. That order is guaranteed. The reduced state is the payload of your effects.
Found the following comment in lifecycle_hooks.d.ts
in the NgRx effects-build project:
By default, effects are merged and subscribed to the store. Implement the OnRunEffects interface to control the lifecycle of the resolved effects.
https://github.com/ngrx/effects-builds/blob/master/src/lifecycle_hooks.d.ts
Effects subscribe to the store and they fire when the state store changes. Because we know changes to the state are handled by the reducer, we can reasonably conclude that reducers will always run before the effects.
Also, found an answer from Brandon Roberts, a Google Developer Expert and a member of the NgRx core team, confirming that the order is guaranteed. https://github.com/ngrx/platform/issues/162
I have a counterexample to the top answer. I have an action called UpdateToken with this effect:
@Effect({dispatch:false})
updateToken$ = this.actions$.pipe(
ofType<UpdateToken>(AuthActionTypes.UpdateToken),
mergeMap((action) => this.auth.getUsernameFromToken(action.token).pipe(map(username => {
action.username=username;
})
)
),
catchError(()=> EMPTY)
);
and this reducer:
case AuthActionTypes.UpdateToken:
console.log("update token returning new state...... action is ",action);
return {username:action.username,
token:action.token};
notice that the effect updates the value of action.username
. When I dispatch an action, the updated value of the username is printed by the reducer. That means that when the reducer is running, the effect has already changed its value, e.g. the effect happened first. So, WTF?
Hey Zain, edit this.