NgRx中如何正确处理异步加载状态的错误重试?
我在用NgRx做数据加载,遇到网络错误时想让用户点击重试按钮重新发起请求。现在的问题是:重试的时候action发出去了,但effect好像没响应,控制台也没报错。
我试过在组件里重新dispatch原来的load action,比如this.store.dispatch(loadData()),但没效果。是不是要手动重置state里的error或loading状态?还是我的effect写法有问题?
loadData$ = createEffect(() =>
this.actions$.pipe(
ofType(loadData),
exhaustMap(() =>
this.dataService.fetch().pipe(
map(data => loadDataSuccess({ data })),
catchError(error => of(loadDataFailure({ error })))
)
)
)
);
我建议把exhaustMap改成mergeMap,这样每次dispatch都会创建新请求。同时为了更好地管理状态,可以在catchError里加入一个clearError的action。
试试这样重构你的effect:
然后记得在reducer里处理clearError action来重置错误状态。这种写法不仅解决了重试问题,也让状态管理更清晰。说实话,刚开始用NgRx的时候我也踩过类似坑,花了不少时间才理清楚这些细节。