我正在使用Angular2和ngrx / store以及ngrx / effects进行状态管理。
当某个操作失败时,我想显示一条错误消息,但似乎我无法在@Effects()
块中执行此任务。请参阅以下内容:
@Effect() selectOfficeFail$ = this.actions$
.ofType(SelectOfficeActions.LOAD_FAIL)
.do(() => {
alert('Error! No offices found!'); // I keep entering here
});
当上面的代码运行时,警报会无数次运行,直到浏览器崩溃。似乎@Effect()
必须返回新的dispatch()
,但我不明白为什么。为什么上面的alert()运行无数次?
修改:我不多次调度SelectOfficeActions.LOAD_FAIL
。只有一次
答案 0 :(得分:16)
[UPDATE]
现在最好的方法是使用setCellsSimplified
选项,如下所示:
dispatch
这意味着“对此操作做出反应但不发送另一个”。
答案 1 :(得分:6)
问题是do
允许操作流过您的效果,然后由商店再次调度操作。您可以使用filter
来防止这种情况发生:
@Effect() selectOfficeFail$ = this.actions$
.ofType(SelectOfficeActions.LOAD_FAIL)
.do(() => {
alert('Error! No offices found!'); // I keep entering here
})
.filter(() => false);
答案 2 :(得分:1)
是的,你是@effect
需要发送一个新动作,但我认为你的应用程序逻辑有问题。
您不应该在组件或服务中调度SelectOfficeActions.LOAD_FAIL
操作,而是调用@Effect
的LOAD操作,然后效果会调度LOAD_COMPLETE
或{ {1}}基于标准。
来自库github的这个example
LOAD_FAIL
答案 3 :(得分:0)
如果使用createEffect
函数,则需要将dispatch: false
标志作为配置参数(ngrx.io reference)传递
effectName$ = createEffect(
() => this.actions$.pipe(
ofType(FeatureActions.actionOne),
tap(() => console.log('Action One Dispatched'))
),
{ dispatch: false }
// FeatureActions.actionOne is not dispatched
);