从reducer / action触发API重新加载的正确方法是什么?

时间:2019-01-09 13:26:10

标签: angular rxjs ngrx ngrx-store ngrx-effects

我有一个非常复杂的应用程序,它通过websocket(用于对象更新)和http(用于获取初始对象)与服务器通信。

但是我正面临以下情况:

  1. 从服务中获取所有初始对象
  2. 网络套接字要求更新列表中未包含的对象
  3. 再次调用该服务以重新加载对象

所以基本上我处于这种状态:

export const initialState: IMatchStore = {
  loading: false,
  needReload: true,
  matches: [],
};

还有一些选择器,例如:

export const getAll = createSelector(
  matchSelector,
  ({ matches }: IMatchStore) => unflatMatches(matches),
);

export const isLoading = createSelector(
  matchSelector,
  ({ loading }: IMatchStore) => loading,
);

export const reload = createSelector(
  matchSelector,
  ({ needReload, loading }: IMatchStore) => !loading && needReload,
);

因此,基本上,当needReload === true时,这意味着我需要重新加载基数(如果列表中不存在match,则在reducer上检测到该值)。

我的问题是:处理这种情况的正确方法是什么?目前,我正在使用该服务,例如:

this.store.select(reload).pipe(filter(Boolean)).subscribe(() => this.load());

但是我认为可以对其进行改进,并将其包装在某些effect


更新

我设法创造了一种可以观看ActionTypes.Update的效果,但效果仍然不理想:p

@Effect()
login$: Observable<Action> = this.actions$.pipe(
    ofType(ActionTypes.Update),
    withLatestFrom(this.store.select(reload)),
    filter(([, needRealod]) => needRealod),
    switchMapTo(
      forkJoin( /** HTTP stuff */ ).pipe(
        map(([a, b]) => new Init(a, b)),
      ),
    ),
  );

1 个答案:

答案 0 :(得分:0)

您发布的最新答案是我眼中的解决之道。

  • 这可以使您的应用程序保持干净
  • 效果可以轻松测试

另请参见Start using ngrx/effects for this