【问题标题】:Why must must ngrx / redux effects return actions? Is using a noop action like elm considered bad practice?为什么 ngrx / redux 效果必须返回动作?使用像 elm 这样的 noop 操作是否被认为是不好的做法?
【发布时间】:2017-10-18 17:14:01
【问题描述】:

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

Cannot read property 'type' of undefined

我研究了这个问题,发现在 elm 架构中有一种叫做“noop”的动作,当你不想用你的效果链接另一个动作时,它什么都不做,你可以调用它。在我看来,到处都调用这个 noop 动作似乎非常重复。我想知道这是否是一个不好的做法。您是否有理由不能产生不返回动作的效果?效果的意图是否总是让一个动作触发另一个动作?我想知道我是否误解了如何使用效果。

谢谢!

【问题讨论】:

    标签: angular redux ngrx ngrx-effects ngrx-store


    【解决方案1】:

    默认情况下,ngrx/effect 调度一个动作。

    如果您希望效果为“即发即弃”,您只需将{dispatch: false} 作为参数添加到@Effects() 装饰器即可。

    来自@ngrx/effects docs

    @Effect() 装饰器装饰的 Observables 应该是要调度的操作流。将{ dispatch: false } 传递给装饰器以防止操作被分派。

    用法:

    class MyEffects {
      constructor(private actions$: Actions) { }
    
      @Effect({ dispatch: false }) logActions$ = this.actions$
        .do(action => {
          console.log(action);
        });
    }
    

    在后台,这是通过ignoreElements operator 实现的。 (Here 是 ngrx/effects 的源代码,如果你有兴趣的话)。 ignoreElements 有一个 built in noop function,每次效果运行时都会得到 called

    简而言之,ngrx/effects 中不需要显式的 noop-action。我不会直接将调度 noop-action 称为“不好的做法”,但在使用 ngrx 时肯定没有必要。

    【讨论】:

    • 好答案,但我建议您更改“这将完成可观察的效果...”的措辞。对于 observables,complete 有特定的含义,{dispatch: false} 不会完成 observable。如果是这样,效果将只运行一次。
    • 你当然是对的,observable 不会完成。我研究了 ignoreElements 的工作原理,结果发现它本身使用了一个 noop 函数。我相应地更改了我的答案并使其更加简洁,因为我一直在重申文档所说的内容:) 谢谢!
    • 当使用较新的 pipeable 操作符时,使用 tap() 而不是 do()。
    • 如果您使用createEffect factory,只需添加{ dispatch: false }作为其第二个参数。
    • 如果你想有条件地返回一个效果怎么办?
    猜你喜欢
    • 2011-12-01
    • 1970-01-01
    • 2010-12-06
    • 2010-11-04
    • 2010-10-22
    • 2011-11-20
    相关资源
    最近更新 更多