2016-06-30 3 views
2

コンポーネントがあります。Listと呼びましょう。アクション作成者はAction1.getItems()です。 Action1.getItems()がサーバーから情報を取得した後、私は別のアクション作成者、Action2.getMoreItems()を呼び出す必要があります。これは別のファイルで全く異なるアクションです。React + Flux:別のアクションの後にアクションを呼び出すためのベストプラクティス?

事実:

  1. どちらのアクションの作成者は、アクションを派遣し、店を変更します。
  2. それがエラーをスローしますので、私はList_onChange()内部Action2.getMoreItems()を呼び出すことはできません "Cannot dispatch in the middle of a dispatch ..."

可能性が? Action1.getItems()内部

  1. コールAction2.getMoreItems()サーバーは、私がAction1.getItems(callback)を持っているとListコンポーネントからそのコールバックの内側Action2.getMoreItems()を呼び出しますよう
  2. がコールバックを追加し返した後。

これはFluxの非常に基本的な使用であるかもしれませんが、私はまだ正しい方法を知りません。どちらの解決策も私には醜いものです。

提案?

ありがとうございました!

答えて

3

getMoreItemsは、戻り値getItemsに依存していますか?その場合は、の.thenコールバックでアクションを呼び出すことができます。

もしそうでなければ、両方の呼び出しを同時に呼び出してから、約束の結果を連結することができます。

私の投票はあなたの質問で2番です。私はそれがまったく醜い解決策だとは思わない。あなたはあなたの行動にアイテムとより多くのアイテムを取得する責任を委任しています。コンポーネント自体はそれを知らず、単純にそれらのアイテムの要求を送出します。それらがどのように構築されているかは、コンポーネントに対して透過的でなければなりません。

+0

本当にありがとうございました。別のアクションクリエイターのアクションクリエイターを要求するのはいいですか? – Aminix

+0

IMO、それは完全に素晴らしいです。 – sma

2

フラックスの実装の大部分は、「waitFor」のようなメソッドを持っています。これは、ストアが別のストアが終了するまで待機します。

店舗に2つの実行メソッドがあるとします(GetUserGetPermissions)。最初のユーザーはユーザーを取得し、後者はアクセス許可を取得し、取得されたユーザーには権限が与えられます。明らかに、GetPermissionsは、最初のメソッドからユーザーオブジェクトをフェッチするのを待つ必要があります。

この場合、GetUserというアクションをディスパッチし、のストア機能のをそのアクションにリッスンします。したがって、GetUserをディスパッチすると、両方のストアメソッドが実行されます。

alt.js(磁束の実装)では、waitFor(store)のようなメソッドがありますので、GetPermissionsはUserStoreがユーザーを取得するのを待つことができます。 altで。js擬似コードは次のようになります。

// UserStore 
function getUser() { 
    fetch('api/user').then(this.setState); 
} 

// PermissionsStore 
function getPermissions() { 
    this.waitFor(UserStore); 
    let user = UserStore.getState().user; 
    fetch('api/permission', user).then(this.setState); 
} 

これは、私が言ったように、擬似コードは動作しませんが、概念を示しています。興味があれば、フラックスの実装alt.jsは素晴らしいです。それをチェックしてください。alt.js.org

関連する問題