2

内部に redux-saga を含む React-boilerplate を実装しようとしています。そのため、サーバーからデータを取得してから、別のページにリダイレクトしようとしています。問題は、サガをリダイレクトする前に、サーバーに 2 番目の要求を行うことです。キャンセルするのは何か問題があると思います。ここに私のコードの一部があります:

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);
  ...
}

前もって感謝します!PS このコードがベスト プラクティスであるかどうかはわかりません。このリポジトリに触発されています

4

2 に答える 2