web-dev-qa-db-ja.com

ngrx / reduxエフェクトがアクションを返す必要があるのはなぜですか? Elmのようなnoopアクションの使用は悪い習慣と見なされていますか?

Angularとngrx/storeおよびngrx/effects)でreduxスタイルの状態管理デザインを使用しています。エフェクトからアクションを返さない場合は常にエラーが発生します。

Cannot read property 'type' of undefined

私は問題を調査し、Elmアーキテクチャーに「noop」アクションと呼ばれるものがあることを発見しました。これは、別のアクションをエフェクトとチェーンさせたくない場合に呼び出すことはできません。このnoopアクションをどこにでも呼び出すことは、私には非常に繰り返しのようです。これは従うべき悪い習慣になるのではないかと思っています。アクションを返さない効果が出ない理由はありますか?常に1つのアクションが別のアクションを発動するというエフェクトの意図はありますか?エフェクトの使い方を誤解しているのではないでしょうか。

ありがとう!

14
Eeks33

デフォルトでは、ngrx/effectがアクションをディスパッチします。

エフェクトを「ファイアアンドフォーゲット」にしたい場合は、@Effects()デコレータの引数として_{dispatch: false}_を追加するだけです。

@ ngrx/effects docs から:

@Effect()デコレータで装飾されたオブザーバブルは、ディスパッチされるアクションのストリームであることが期待されています。アクションがディスパッチされないようにするには、デコレータに_{ dispatch: false }_を渡します。

使用法:

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

  @Effect({ dispatch: false }) logActions$ = this.actions$
    .do(action => {
      console.log(action);
    });
}
_

内部的には、これは ignoreElements演算子 で実現されます。 ( ここ は、興味がある場合はngrx/effectsのソースコードです)。 ignoreElementsには built in noop function があり、エフェクトが実行されるたびに called を取得します。

つまり、ngrx/effectsで明示的なnoopアクションを実行する必要はありません。 noop-actionをディスパッチすることを「悪い習慣」と呼ぶことはあきらめませんが、ngrxを使用する場合は確かに必要ありません。

28
mtx