2015-10-15 12 views
29

は、私はこのようなコンポーネントを反応 は私が私の中にReduxの非同期アクションに2つのコールバックを渡し、成功/エラー応答のためのさまざまな通知バーを表示したい:callBacksをredux非同期アクションに渡すのは良い方法ですか?

asyncActionはこのようになります
<Button 
    onClick={e => this.props.actions.asyncAction(item, this.showSuccessBar, this.showErrorBar)} 
/> 

export function asyncAction(item, successCallback, errorCallback) { 
    return (dispatch, getState) => { 
    dispatch(requestItem(item)); 
    return fetch("api.some_url/items/item") 
     .then(response => response.json()) 
     .then(json => { 
     if (json.success) { 
      dispatch(receivePostsSuccess(reddit, json)); 
      successCallback(); 
     } else { 
      dispatch(receivePostsFail(reddit, json)); 
      errorCallback(); 
     } 
     }); 
    } 
    }; 
} 

これはパターンと考えられますか? つまり、コールバーの代わりに状態の変更に応じて通知バーを開く必要がありますか?

答えて

67

パターン自体は良いです。これがコンポーネントのローカル通知であれば、Reduxを介して配線しないでください。

すでに約束を返しているので、コールバックはまったく不要です。です。完了までお待ちください。あなたは、このような通知バーで多くのコンポーネントを持っている場合

this.props.dispatch(asyncAction(item)).then(onSuccess, onFailure); 

しかし、それは減速現在の通知を維持し、アクションに反応を持っている方が良いでしょう。

+1

ありがとう、これはかなりうまくいった。また、redux&devtoolsなどの素晴らしい作業に本当に感謝します!私たちはそれらを愛していました:)私も関連する質問がありますhttp://stackoverflow.com/questions/33237712/how-to-undo-redux-async-action-multiple-steps-back-in-the-stateわからないもし私が正しい方向にいたら。 – naifen

+0

@ Dan-Abramovフォローアップ:ディスパッチが約束を返せば、いつ解決するのですか?上の例では、たとえば、asyncActionは、(サンクミドルウェアごとに)約束を返すように見える関数を返します(前にこれらの戻り値を実際に見たことはありませんでしたが、したがって、ディスパッチの上にチェーンを張った場合、その時点でどの点で解決されますか? –

+1

@RubenMartinezJr。私はその質問を理解していない。サンクミドルウェアは、サンクの戻り値(Promise)が 'dispatch'自体から返されるようにします。アクション作成者が決定するたびに解決し、このプロミスの作成方法に依存します。これは役に立ちますか?たぶんあなたは別の質問を作成できます。 –

0

これは、双方向データフローであり、フラックスの第1の規則を破る。

+7

ダン・アブラモフ大丈夫だと言っています.D –

2

smthという名前のストアをNotificationStoreのように区切り、その周りに通知のインフラストラクチャを構築することをお勧めします。コールバックを使用することはできますが、将来は大きな問題になります。

関連する問題