У меня есть угловое приложение, в котором я хочу, чтобы побочный эффект вызывал службу на стороннюю аналитическую платформу. Моя мысль была сделать
Any action fires -> Side effect catches everything -> Service to call analytics
При этом я, очевидно, не хочу добавлять этот поток в каждый эффект. Я просто хочу, чтобы побочный эффект «всеобъемлющий» в верхней части дерева перехватывал любые и все действия Ngrx и вместо отправки действия просто вызывал службу. У меня проблемы с синтаксисом...
@Injectable()
export class AmplitudeEffects {
constructor(private actions$: Actions) {}
@Effect()
private *any action here* = this.actions$.pipe( <--what to put here
ofType(), <-- leave empty to catch everything?
mergeMap(() =>
this.amplitudeService.sendValues(arg1, arg2, arg3, arg4).pipe(
// catchError(error => of(new AmplitudeFailure(error)))
)
)
);
}
Это хороший вариант использования Эффекта, я также привожу этот пример в Начните использовать для этого ngrx/effects.
Чтобы ответить на ваш вопрос, вы можете просто убрать ofType
:
@Effect()
log = this.actions$.pipe(
mergeMap(() =>
this.amplitudeService.sendValues(arg1, arg2, arg3, arg4).pipe(
// catchError(error => of(new AmplitudeFailure(error)))
)
)
);
Я не уверен, хотите ли вы поймать ошибку, так как это только для целей ведения журнала, поэтому вы можете сделать:
@Effect({ dispatch: false })
log = this.actions$.pipe(
mergeMap(() =>
this.amplitudeService.sendValues(arg1, arg2, arg3, arg4)
)
);
Просто удалите ofType, и ваша обработка ошибок просто завершит наблюдаемое, поэтому ngrx перестанет работать, поэтому я добавил правильный способ обработки catchError. Я должен выглядеть так, но, поскольку я не знаю, что делает sendValues, я решил, что он вернет наблюдаемое.
@Effect()
name = this.actions$.pipe(
this.amplitudeService.sendValues(arg1, arg2, arg3, arg4).pipe(
map((x: any)=> x),
catchError((error: any, effect: Observable<Action>) => {
return effect.pipe(startWith(new new AmplitudeFailure(error)));
}
)
)
);
Простое комментирование функции ofType() должно работать.