启动应用程序时我应该 运行 所有 saga 吗?

Should I run all saga when launch app?

我刚开始学习和使用redux-saga,起初我以为它是这样工作的:首先你做一个连接到saga的动作,然后saga检测动作,调用api returns data and saga returns 这个数据到reducer。我构建了 2 个测试 saga 文件和一个 root saga(我想制作 rootSaga,比如 combineReducer),所以这是我的 rootSaga:

import * as SpreadsheetSagas         from "../pages/spreadsheet/containers/spreadsheet/spreadsheet.saga";
import * as SpreadsheetFilterSagas   from "../pages/spreadsheet/containers/spreadsheet_filter/spreadsheet_filter.saga";

export default function* rootSaga() {
  yield all([
    ...Object.values(SpreadsheetSagas),
    ...Object.values(SpreadsheetFilterSagas)
  ].map(fork))
}

这是我的传奇功能之一:

export function* getData() {
   const response = yield call(ApiService.get);
   const payload = response ? response.data : {};
   //send returned object back to reducer as payload:
   yield put({ type: 'GET_MOCK_DATA', payload});
}

我的商店文件夹如下所示:

const middleWare = [];

// Setup Redux-Saga.
const sagaMiddleware = createSagaMiddleware();
middleWare.push(sagaMiddleware);

const store = createStore(rootReducer, {}, 
compose(applyMiddleware(...middleWare)));

// Initiate the root saga.
sagaMiddleware.run(rootSaga);

所以,当我 运行 我的应用程序时,它会调用每个 saga 函数 - 这是实现 sagas 的正确方法:?或者我应该有几个取决于当前页面的 rootSaga 文件,然后当我打开页面时,运行 适当的 rootSaga?我希望我正确解释了一切:/请给我任何建议。谢谢。

我认为通常您只有一棵与整个应用程序相关的 sagas,而不是针对不同 pages/routes 的多个根 sagas。你只需附加一次 rootSaga,作为中间件。

所以是的,当您的应用程序启动时,整个 sagas 树都会启动,并且会观察动作。 Sagas 在全球范围内与您的商店互动,因此他们在全球范围内开始使用您的应用程序是有意义的。

只启动监视动作的 sagas(使用 taketakeEvery 等)。其他产生副作用或调用 api 的 sagas 不应在您的应用启动时调用。

创建类似于 reducer 的 sagas 树,combineReducer 也是正确的方法。