私はredux-sagaを内部に持つReact-boilerplateを実装しようとしています。だから私は、サーバーからいくつかのデータを取得し、別のページにリダイレクトしようとしています。問題は、リダイレクトする前にsagaがサーバーに2回目のリクエストを行うことです。私はそれをキャンセルすることに何か問題があると思う。ここに私のコードの一部です:Redux-sagaは取り消し後にアクションを呼び出します
export function* fetchData() {
...
console.log('fetched');
yield browserHistory.push('/another-page');
}
export function* fetchDataWatcher() {
while (yield take('FETCH_DATA')) {
yield call(fetchData);
}
}
export function* fetchDataRootSaga() {
const fetchWatcher = yield fork(fetchDataWatcher);
yield take(LOCATION_CHANGE);
yield cancel(fetchWatcher);
}
export default [
fetchDataRootSaga
]
この例では、2つのコンソールログがあり、2つ目はリダイレクトする前に表示されます。どうすれば修正できますか?
そして別の質問です。実際、このファイルにはもっと多くの機能があります。私はそれらのそれぞれのために "rootSaga"を作成する必要がありますか、私はそれらをすべて取り消すことができますfetchDataRootSaga()?私はこのようにサガをキャンセルすれば正常です。
export function* fetchDataRootSaga() {
const watcherOne = yield fork(fetchDataOne);
const watcherTwo = yield fork(fetchDataTwo);
...
yield take(LOCATION_CHANGE);
yield cancel(watcherOne);
yield cancel(watcherTwo);
...
}
ありがとうございます! P.P.このコードがベストプラクティスかどうかはわかりません。触発されているthis repository
あなたが書いたとおりにしましたが、サーバに依然として2つのリクエストがあります。 – th1rt3nth
'FETCH_DATA'というアクションを2回ディスパッチしていないことを確認しましたか? take()をtakeLatest()に変更するとどうなりますか? – garajo