为什么必须ngrx/redux效果返回动作?是否正在使用像榆树这样的不良行为?

Eek*_*s33 12 redux ngrx ngrx-effects angular ngrx-store

我正在使用带有Angular和ngrx/store和ngrx/effects的redux风格的状态管理设计.每当我不从效果中返回动作时,我都会收到错误:

Cannot read property 'type' of undefined
Run Code Online (Sandbox Code Playgroud)

我研究了这个问题,发现在榆树架构中有一种称为"noop"的动作,当你不想用你的效果链接另一个动作时,你可以调用任何东西.在任何地方召唤这种noop行动对我来说都是非常重复的.我想知道这是否是一个不好的做法.有没有理由你不能产生不返回动作的效果?效果的意图总是有1个动作引发另一个动作吗?我想知道我是否误解了如何使用效果.

谢谢!

mtx*_*mtx 24

默认情况下,ngrx/effect会调度操作.

如果你想让一个效果"发射并忘记",你需要做的就是将它{dispatch: false}作为参数添加到@Effects()装饰器中.

来自@ ngrx/effects文档:

@Effect()装饰器装饰的Observable 预计将是一系列要调度的动作.传递{ dispatch: false }给装饰器以防止分派操作.

用法:

class MyEffects {
  constructor(private actions$: Actions) { }

  @Effect({ dispatch: false }) logActions$ = this.actions$
    .do(action => {
      console.log(action);
    });
}
Run Code Online (Sandbox Code Playgroud)

在引擎盖下,这是由ignoreElements操作员实现的.(如果您有兴趣,这里是ngrx/effects的源代码). ignoreElements有一个内置的noop函数,每次效果运行时都会调用它.

简而言之,ngrx/effects中不需要明确的noop-action.我不会直接称之为"不良行为"来发出一个noop-action,但在使用ngrx时肯定没有必要.

  • 如果您想有条件地返回效果怎么办? (5认同)
  • 如果您使用 createEffect 工厂,只需添加 {dispatch: false }` 作为其第二个参数。 (4认同)
  • 使用较新的管道运算符时,请使用tap()而不是do()。 (3认同)
  • 很好的答案,但我建议您更改*“这将完成可观察到的效果……” *的措词。对于可观察对象,* complete *具有特定含义,而`{dispatch:false}`不能完成可观察对象。如果这样做,效果将只运行一次。 (2认同)