2016-07-27 13 views
1

Reduxサンクを使用して、サーバへのフェッチや投稿などの非同期アクションをディスパッチしています。それぞれのアクションクリエータコールは約束を返します。これは、ajaxがマジックを行った後、そしてReduxが実際にajaxの成功/失敗に従って状態を更新するための正しいアクションを送出したときに解決されます。このようにして、コンポーネントレベルでディスパッチ後のコールバックをカスタマイズできます。ReactとReduxのサンクをメンテナンス可能な方法でサーバ/接続例外を処理する方法

componentsDoPostHandler(data) { 
    this.props.doPostActionCreator(data) 
    .catch(error => { 
     alert(error) 
     this.setState({...}) 
    }) 
} 

すべてがこの単純な例で結構ですが、私はこのパターンでロジックを処理し、実際のエラーを導入しようとすると、キャッチ内から再帰的にcomponentsDoPostHandlerを呼び出し、そして、カウンタ壊すような -

doPostActionCreator(data) { 
    return dispatch => { 
    return httpService.post(data) { 
     .then(response => { 
     dispatch({type: POST_SUCCESS, data: response}) 
     return response 
     }) 
     .catch(error => { 
     dispatch({type: POST_ERROR}) 
     return error 
    )} 
    } 
    } 
} 

制限が超過すると、物事は醜く見え始め、維持しにくくなり、壊れやすい。私の実際の世界のシナリオでは、実際にはfetchCsrfTokenActionCreatorのコールバックであり、それ自体が同じエラー処理ロジックを必要とし、X回フェッチして失敗した場合は何か他の処理を行う必要があります。今では、1つのページに2つの異なるコンテナが含まれていて、どちらもこのロジックを紹介している場合、アクションクリエイターと呼ばれると取り消すことはできないため、最初にリカバリを実行した後、結局のところ、プログラムがどのように動作しているのかを知ることは難しく、「同期が外れている」アクションの問題が発生し始め、アプリケーションが不整合な状態になり、問題を追跡するのが困難になります。

アクションクリエイターからの約束を返すのが実際に反パターンであり、最終的には維持できないコードにつながるのではないかと思います。 React/Reduxスタックを使用して非同期サービスエラーを処理する方法を実際の例では見つけられませんでした。私はそれを間違っているのですか?非同期の例外を処理するためのよりクリーンな方法があります(理想的にはX回試し、ユーザーに警告してログインページに戻ります)。

トピックに関する任意の実世界の例は非常に私はあなたがアクションの作成者自身の中にあなたの再試行ロジックのすべてを扱うことができると信じて

答えて

2

をいただければ幸いです。つまり、コンポーネントから、またはアクション作成者に電話しているどこからでも、.catch()に電話をかけるために何かを返す必要はないと思います。サンクのgetState()メソッドにアクセスできることを忘れないでください。つまり、アクション作成者の.post().catch()には、何かが失敗したことを示すために何かをディスパッチできます。これはおそらく失敗の数を追跡する減速器によって処理できますディスパッチコール.getState()は、そこにいくつの失敗があったかを確認し、そこから何をすべきかを決定します(つまり、もう一度やり直すか、何かが何度も失敗したことを示す別のアクションを送ります。状態)。

あなたが見ている問題を簡略化すると、私はアクションクリエイターの外で.catch()を心配しないと思います。このロジックをいくつかのアクションクリエータで発生させたい場合は、このロジックを処理するAPI呼び出しメソッドに抽象化することができます。

+0

一般的に私はこのパターンを使用します。私のサンクスは何も返さない。私のコンポーネントは、アクションクリエイターを「火と忘れ」の方法で呼び出すだけで、アクションクリエーターからの戻り値で何もしようとしません。失敗した約束は、Redux状態を失敗で更新します。コンポーネントはこの失敗状態を認識し、必要に応じてより多くのアクションを発行できます。または、サンクを内部的に再試行することができます...再試行を処理する方法を指示するアクション作成者を呼び出すときにコンポーネントが提供する追加の引数を取ることさえできます。 – Brandon

+0

どのようにしてこのペーストを異なるペースで実行しても、フェッチが失敗して設定されたエラー状態がログインページにつながり、状態がクリアされ、その後に2回目のフェッチが失敗し、状態の整合性。私はRedux Sagaがアクションを中断することについて聞いたことがあるが、まだ別のフレームワークを紹介したくない。また、Reduxのエラー状態を実際にチェックして処理するには、何が良い方法ですか?おそらくFailComponentをエラーでレンダリングする、一般的な上位レベルPageComponentです。これは、マウント・ディスパッチではログイン・アクションに戻りますか? –

+0

前への追加:私は、任意のプレゼンテーションコンポーネントがフェッチ失敗後にレンダリングしようとしないことを心配しています。マップや他の機能をその地点に存在しないものにしようとします。 –

関連する問題