当不在ngrx / effects中调度动作时,陷入无限循环

时间:2016-08-25 11:08:35

标签: angular ngrx

我正在使用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。只有一次

4 个答案:

答案 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
);