2017-07-20 9 views
0

私はredux非同期アクションを処理するためにredux-observableを使用します。クリアアクションepicのための無限ループ

idでモジュールの状態をクリアする必要があります。

これは私のclearModuleByIdEpic次のとおりです。

const clearModuleByIdEpic = (action$: ActionsObservable<any>) => { 
    return action$.ofType(t.CLEAR_MODULE_BY_ID) 
    .map((action: IActionPayload<any>): string => action.payload.id) 
    .map(clearModuleById); 
} 

これは私のコンポーネントのメソッドです:clearModuleByIdアクションを呼び出します。

private onClear(id: string) { 
    this.props.clearModuleById(id); 
    } 

しかし、削除ボタンをクリックすると、onClearクリックイベントが発生します。

これは、clearModuleByIdアクションの無限ループをトリガーします。

私は間違いを犯しましたか?

答えて

2

あなたは、あなたがその叙事詩でフィルタリングしている叙事詩から同じアクションをディスパッチしているようです。これは常に無限ループになります。あなたはいつもA)異なる行動を起こすか、B)適切な副作用を引き起こした後に叙事詩に他の何かを派遣しないようにする必要があります。

あなたの叙事詩は実際には何もしていませんが、同じアクションを同期して再ディスパッチしているようにも見えません。あなたは、アクションに1つ以上の(a)同期的な副作用を実行できるようにすることができます。

一般的に言えば、ある種のエスケープハッチでそうしない限り、同じアクションを叙事詩から再ディスパッチしないでください。これは事実上再帰の一形態であり、通常の再帰的問題のすべてが適用されます。再帰から脱出できないということは、無限ループを意味する。

*例外はありますが、この時間は99.99%です。

+0

また、これはおそらく、redux-observableの動作のわずかな誤解のためです - あなたの叙事詩は、後で*減速機に到達した*後の動作を受信するので、着信を再ディスパッチする必要はない行動。概念的には、私はあなたの叙事詩がサイドレビュックスに沿って走っていると思っています。彼らは通常の犠牲者を呑み込むことや他の方法で防止することはできません、彼らは行動を聞くことができ、オプションで、通常は副作用を実行した後、ある時点で他の行動を出すことを決めます。 – jayphelps