2017-05-08 19 views
2

私はここで基本的な理解が欠けていると思います。私は、アクションが作成され、イベントの連鎖を開始するために、アクション作成者はdispatchを使用して呼び出さなければならないことを認識しています。なぜredux-thunksをディスパッチする必要がありますか?

しかし、私たちがアクション作成者にdispatchを呼び出す関数を返すredux-thunkを持っている場合、なぜredux-thunkもdispatchで呼び出される必要がありますか?例えば

は、以下のReduxの-サンクを取る:dispatchことなく、このsavePerson機能を呼び出す

function savePerson(person: Person) { 
    return async (dispatch: any) => { 
     delete person.cars; 
     let newPerson = await axios.post('/api/people/addPeron', person); 
     dispatch(addPersonSuccess(person)); 
    } 
} 

はReduxの流れをオフに設定しないと、それが返す関数を考慮すると、私たちの行動の作成者を呼び出して、なぜ私は理解していませんdispatchとなります。誰かが私がここに欠けているように見えるものを明確にすることはできますか?

+0

と思います。 –

答えて

2

すべてのReduxのミドルウェアは、同じ一般的なレイアウトは以下:

const middleware => store => next => action => next(action);

をなぜReduxの-サンクもdispatchで呼び出さなければなりませんか?

あなたが正しくあなたの最初の段落で指摘のように、Reduxのミドルウェア・チェーンによって評価されるべきアクション/サンクのために、それは、呼び出し元のコードでdispatchエドなければなりません。

私は誤解がここに来ると思う:

「...私たちはどの私たちの行動の作成者に コール発送はする関数を返すReduxの-サンクを持っているとき...」。

それが返される関数は、アクションをディスパッチすることが正しいですが、それは半分だけの話です。技術的には、の2回:最初にsavePerson以降のaddPersonSuccessに発送しています。前者はサンクであり、後者はおそらく単純な行動である。

それでは、現在のredux-thunksource codeを考えてみましょう:あなたはsavePersonを派遣

function createThunkMiddleware(extraArgument) { 
    return ({ dispatch, getState }) => next => action => { 
    if (typeof action === 'function') { 
     return action(dispatch, getState, extraArgument); 
    } 

    return next(action); 
    }; 
} 

... 

export default thunk; 

たら、ミドルウェアは、機能としてのあなたの行動を認識しています。その後、最初の引数としてdispatchを注入し、後で他のアクションのディスパッチを許可します。今まであなたのaddPersonSuccessアクションではdispatchが呼び出されていません。人を追加する非同期呼び出しの後でのみ、addPersonSuccessでディスパッチが呼び出されます。

私はこれをサンク(dispatch、getStateなど)に沿ってreduxコンテキストを渡すと考えています。

参照する別の減速など、このの
関連する問題