У меня довольно сложное приложение, которое связывается с сервером через websocket (для обновления объектов) и http (для получения исходного объекта).
Но я сталкиваюсь со следующей ситуацией:
- Получить из сервиса все исходные объекты
- Веб-сокет просит обновить объект, которого нет в списке
- Сделайте еще один вызов в службу для перезагрузки объектов
Так что в основном у меня это состояние:
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
не существует в списке).
Мой вопрос : Как правильно обращаться с этой ситуацией? В настоящее время я делаю на службе, как:
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)),
),
),
);