ngrx: RxJS integration with example

Deepak Ranolia
2 min readApr 4, 2023

--

Here is an example of how RxJS can be integrated with ngrx in an Angular application.

Let’s say we have a feature state for a user in our application. The state interface might look something like this:

export interface UserState {
user: User;
loading: boolean;
error: string;
}

In this state, we have a user object, a loading flag to indicate whether the user is being loaded, and an error message if any error occurs while fetching the user.

To handle the state changes related to fetching the user, we can define actions for each possible state change. For example, here is an action for loading the user:

export class LoadUser implements Action {
readonly type = UserActionTypes.LoadUser;
constructor(public payload: number) {}
}

This action has a type and a payload, which is the user ID that needs to be fetched.

Next, we can define an effect to handle this action using RxJS:

@Injectable()
export class UserEffects {
loadUser$ = createEffect(() =>
this.actions$.pipe(
ofType(UserActionTypes.LoadUser),
mergeMap((action: LoadUser) =>
this.userService.getUser(action.payload).pipe(
map((user: User) => new LoadUserSuccess(user)),
catchError((error: any) => of(new LoadUserFail(error)))
)
)
)
);
  constructor(
private actions$: Actions,
private userService: UserService
) {}
}

This effect listens for the LoadUser action using ofType, and then calls the getUser method of the userService to fetch the user. When the user is successfully fetched, it dispatches a LoadUserSuccess action with the user as the payload. If any error occurs while fetching the user, it dispatches a LoadUserFail action with the error as the payload.

Finally, we can define a reducer to handle these actions and update the state:

export function userReducer(state: UserState, action: UserActions): UserState {
switch (action.type) {
case UserActionTypes.LoadUser:
return {
...state,
loading: true,
error: ''
};
case UserActionTypes.LoadUserSuccess:
return {
...state,
user: action.payload,
loading: false,
error: ''
};
case UserActionTypes.LoadUserFail:
return {
...state,
loading: false,
error: action.payload
};
default:
return state;
}
}

This reducer takes the current state and the action as input, and returns a new state based on the action. In this case, when a LoadUser action is received, the reducer sets the loading flag to true and clears any existing error. When a LoadUserSuccess action is received, the reducer updates the user object and sets the loading flag to false. When a LoadUserFail action is received, the reducer sets the loading flag to false and updates the error message.

By integrating RxJS with ngrx in this way, we can handle asynchronous state changes in a predictable and consistent manner, making our application more maintainable and easier to reason about

BONUS BELOW

If you are new to the web development and hustling for bread and butter due to low income, Please check out the below link
Live Chat Jobs — You have to try this one at home

--

--

Deepak Ranolia
Deepak Ranolia

Written by Deepak Ranolia

Strong technical skills, such as Coding, Software Engineering, Product Management & Finance. Talk about finance, technology & life https://rb.gy/9tod91

No responses yet