У меня есть приложение Angulr с NgRx, внутри одного из моих эффектов у меня есть неожиданный эффект, который, оказывается, ожидается, но я не знаю, как это исправить.
Мой минимизированный код
@Effect()
detelete$ = this.actions$
.pipe(
ofType<fromActions.DeleteRequested>(fromActions.ActionTypes.DeleteRequested),
map(action => action.payload.id),
mergeMap(id =>
combineLatest([
of(id),
this.rservice.deleteById(id)
.pipe(
catchError((err, caught$) => {
this.store.dispatch(new fromActions.DeleteCancelled({id: id}));
return caught$;
})
)
])
),
map(([id, ]: [string, any]) => {
return new fromActions.DeleteSuccess({id: id});
}),
);
Причина, по которой мои catchError
не находятся на том же уровне, что и мои mergeMap
, заключается в том, что мне нужно id
в качестве полезной нагрузки для моего действия fromActions.DeleteCancelled
.Кроме того, мой сервис возвращает только логическое значение, поэтому я использую combineLatest
, чтобы сохранить его для моего onSuccess
map
.
Я испытываю то, что catchError
выполняется несколько раз.Таким образом, отправляя мои действия с ошибками несколько раз.
Я обнаружил, что
Если вы вернете этот источник, наблюдаемое будет эффективно перезапускаться снова и повторять попытку
Inв этом случае source
- это мое caught$
.
Если внутри моего cacthError
я вернусь
return of(new fromActions.DeleteCancelled({id: id}));
Это все равно перейдет к моему onSuccess map
.Я мог бы, возможно, проверить, является ли мой второй параметр внутри этого map
типа os Action
или boolean
, но я думаю, что есть правильный способ справиться с этим, и я не знаю его.
StackBlitz (раскомментируйте subscribe
, чтобы увидеть бесконечный цикл)
Спасибо.