2016-08-09 8 views
1

私はfetch()関数の実行を制御することに問題があります。特に私は、ユーザがfetch()リクエストを迷惑にならないようにしたい。fetch()はいつReduxで実行されますか?

私はミドルウェアの中でこれを行うことを考えていましたが、fetch()を使ったアクションがそこに到達するまでには、ペイロードはすでに約束しています。

私の質問は、正確にfetch()がすでに実行されているのですか?

大事な場合は、私のコードはおおよそ次のようになります。

親アクション:

{ 
    return (dispatch) => { 
    if (mode === 'MY') { 
     dispatch(myAction(...); 
    } 

    dispatch(someOtherAction(...)); 
    } 
} 

私のアクション:

{ 
    type: 'TYPE', 
    promise: post(url, payload) 
} 

私のポスト方法:

{ 
    console.log('sending POST'); 

    return fetch(url, { 
    //fetch info 
    }); 
} 

マイミドルウェア:

{ 
    return next => action => { 

    const { promise, //other fields } = action; 
    //Already a promise here. 

    if (!promise) { 
     return next(action); 
    } 

    return promise.then(
     //Processing data 
    ); 
    }; 
} 
+0

Reduxのドキュメントを読んで、私はこの行を見つけました "...アクション作成者が関数を返すと、その関数はRedux Thunkミドルウェアによって実行されます..." これは私の問題がRedux-Thunkに起因することを意味しますか?私のアクションがディスパッチされるたびにRedux-Thunkは私のカスタムミドルウェアに達する前に即座に私の機能を実行します。 –

答えて

0

私はミドルウェアの中でこれを行うことを考えていましたが、fetch()を使ったアクションがそこに到達するまでには、ペイロードはすでに約束しています。

この問題を解決するには、アクション内のチェックとして行います。だから、フェッチ要求を起動すると、フェッチが現在実行中のアクションをディスパッチし、状態をfetching = trueと更新します。フェッチを使用する必要がある他のアクションでは、その状態をチェックし、それが真であれば何も返しません。

あなたのコメントに答えるために:あなたは、アクションの作成者を呼び出すと

、それは当然のことながら、すぐに呼ばれています。ディスパッチを呼び出すと、関数が実行されます(redux-thunkを使用している場合)。今、redux-thunkはミドルウェアなので、ミドルウェアを添付した注文に応じて実行します。したがって、あなたが自分のミドルウェアをredux thunkの前の設定に入れると、その前に実行されます。

const store = createStore(
    combineReducers(reducers), 
    applyMiddleware(yourMiddleware, ReduxThunk) 
); 

そうでなければ、正しいことが理解できます。アクションはdispatchを呼び出した直後に起動し、ミドルウェアを順番に実行し、アクション情報をレデューサーに渡します。

+0

答えをありがとう。 ミドルウェアの順序を変更してみて、カスタムミドルウェアに入ってきたものを記録しました。私はまだそれが約束を受けていることに気づいた。 サンドに到達する前にミドルウェアを最初に通過すると、約束の代わりに私のポストメソッドを記録すべきですか? –

+0

ミドルウェア内でdispatch()、次にnext()に渡すものは、どのミドルウェアが受け取るものです。したがって、action.promise()を呼び出して次のミドルウェアに何か他のものを渡したい場合は、新しいオブジェクトを作成してnext()に渡す必要があります。 redux-thunkは、関数と特別なことを約束しない。それは、オブジェクトの代わりに返される関数をどのように扱うかを知っているだけです。クレイジーシンプルです:https://github.com/gaearon/redux-thunk/blob/master/src/index.js – agmcleod

関連する問題