我有一个棱角分明的应用程序,在这里我希望产生副作用,以便将服务调用到第三方分析平台。我的想法是要做
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)))
)
)
);
}
答案 0 :(得分:1)
这是一个效果的好用例,我也在Start using ngrx/effects for this中给出了此示例。
要回答您的问题,只需将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)
)
);
答案 1 :(得分:1)
只需删除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)));
}
)
)
);