I have a common functionality to get items from server.
export const getAllEffect = <TEntity, TData>(args: InputArgs<TEntity, TData>) => {
const {
actions$,
entity,
subExists$,
getAllApi,
collectionIdFn,
} = getParams(args)
const getAllTrigger$ = actions$.pipe(
ofActionAndPayload<GetAllPayload<TData>>(AsyncActions.GetAll),
ofEntity(entity));
// Force triggers ignore subscriptions for collection
const forceTriggers$ = getAllTrigger$.pipe(filter(({ force }) => force))
const softTriggers$ = getAllTrigger$.pipe(filter(({ force }) => force))
const softTriggersFilteredBySub$ = softTriggers$.pipe(filterSubExistsWithCancellation(subExists$))
// Emits load action when all filters are passed otherwise returns undefined (to cancel request)
const trigger$ = merge(forceTriggers$, softTriggersFilteredBySub$)
const cancelAction$ = of(new LoadActions.SetLoading(entity, false))
const preLoadAction$ = of(new LoadActions.SetLoading(entity, true))
const getPostLoadActions = (trigger: GetAllPayload<TData>) => (entities: TEntity[]): Action[] => {
return [
new CollectionActions.AddAll(collectionIdFn(trigger.data), entities),
new LoadActions.SetLoaded(entity, true),
new LoadActions.SetLoading(entity, false),
]
}
const getFailedActions = (trigger: GetAllPayload<TData>) => (response: HttpErrorResponse): Action[] => {
return [
new AsyncActions.GetAllFailed({ entity, response, data: trigger.data, count: trigger.count }),
new LoadActions.SetLoading(entity, false),
]
}
return trigger$.pipe(
switchMap((trigger) => {
debugger;
// Don't do any loading + cancel prev request if present
if (!trigger) return cancelAction$
return concat(
preLoadAction$,
getAllApi(trigger.data).pipe(
retry(apiRetryCount),
switchMap(getPostLoadActions(trigger)),
catchError(getFailedActions(trigger)),
),
)
}),
)
}
The trigger merges all effects to be executed.
The effect is ran, I can debug it.
but I never get to the switchMap part where debugger is written. I don’t know why.