You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NGRX Effect运行正常但Store未存储正确数据问题排查求助

问题修复方案

1. 修复Action类型标识重复问题

你在UserActions.ts中定义的FetchUsersFail的类型标识和成功Action完全一致,会导致异常逻辑冲突,修改为正确的失败标识:

// 修改前
export const FetchUsersFail = createAction(
  '[USER] FETCH SUCCESS',
  props<{ error: string }>()
);
// 修改后
export const FetchUsersFail = createAction(
  '[USER] FETCH FAIL',
  props<{ error: string }>()
);

2. 修复Reducer中成功回调未重置loading的问题

你在处理成功Action时,没有将loading状态重置为false,导致请求结束后loading一直为true:

// 修改前
on(UserActions.FetchUsersSuccess, (state, { data }) => {
  return { ...state, users: [...state.users, ...data] };
})
// 修改后
on(UserActions.FetchUsersSuccess, (state, { data }) => {
  return { ...state, loading: false, users: [...state.users, ...data] };
})

3. 为Effect添加错误处理逻辑

当前Effect没有处理请求异常的场景,一旦请求报错会导致Effect终止运行,添加catchError逻辑:
首先从rxjs导入对应依赖:

import { map, exhaustMap, catchError } from 'rxjs/operators';
import { of } from 'rxjs';

然后修改Effect逻辑:

userFetch$ = createEffect(() =>
  this.actions$.pipe(
    ofType(UserActions.FetchUsersRequest),
    exhaustMap((action) =>
      this.userService.getUsers().pipe(
        map((response: any) => {
          console.log(response);
          return UserActions.FetchUsersSuccess({ data: response });
        }),
        // 新增错误处理
        catchError((err) => of(UserActions.FetchUsersFail({ error: err.message })))
      )
    )
  )
);

4. 修正组件中状态选择的逻辑

你在AppComponent中store.select('users')拿到的是整个用户模块的状态对象(包含loading、error、users三个属性),如果要获取用户数组,需要修改选择逻辑:

// 方法1:直接选择嵌套属性
this.users$ = this.store.select(state => state.users.users);

// 方法2:使用NGRX的select重载
this.users$ = this.store.select('users', 'users');

如果你需要保留整个状态对象,在模板使用时需要额外取users属性,示例:*ngFor="let user of (users$ | async)?.users"。

5. 确认文件导入路径匹配

检查App.module.ts中导入UserEffects的路径是否和实际文件名一致,你提供的Effect文件名为UserEffect.ts,但导入路径是./User/Users.effects,如果实际文件名不匹配会导致Effect不生效,根据实际文件名修正导入路径即可。

修改完成后即可正常在Store中看到返回的用户数据。

内容的提问来源于stack exchange,提问作者Tirth Trivedi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 20:24:05