如何在运行期间更换传单?

时间:2017-02-01 22:09:07

标签: generator redux-saga

我有一个可以连接到不同API端点的React Native应用。某些用户可能需要在运行时更改API端点,而无需重新启动应用程序。所有的API请求都绑定到了sagas,root saga看起来像

export default function* rootSaga() {
  yield [
    takeLatest([
      ONE_REQUEST,
      ANOTHER_REQUEST,
      // a bunch of sagas that are responsible for API querying
    ], api); // <- here, api is global.
  ];
}

因此它可以与新实例化的Redux商店一起运行:

import rootSaga from './sagas';

const sagaMiddleware = createSagaMiddleware();
const store = createStore(rootReducer, applyMiddleware(sagaMiddleware));

// other stuff, and finally

sagaMiddleware.run(rootSaga).done.catch(console.error);

问题是,一旦执行,商店,更不用说传奇,永远不会更新。

我试图将api作为第一个参数传递给root saga:

export default function* rootSaga(baseUrl = DEFAULT_API_URL) {
  const api = create({
    baseUrl,
    // other stuff that is required by apisauce
  });

  yield [
    takeLatest([
      ONE_REQUEST,
      ANOTHER_REQUEST,
      // a bunch of sagas that are responsible for API querying
    ], api); // <- here, api is instantiated per every yield* of rootSaga.
  ];
}

我试图从某个特定动作类型执行的函数中引用生成器本身:

yield [
  takeLatest([
    ONE_REQUEST,
    ANOTHER_REQUEST,
    // a bunch of sagas that are responsible for API querying
  ], api); // <- here, api is instantiated per every yield* of rootSaga.

  takeEvery([
    REPLACE_API // <- the action I would dispatch to replace API endpoint
  ], ({endpoint}) => {
    yield cancel(rootSaga);
    yield* rootSaga(endpoint); // <- the new API endpoint
  });
];

但它没有用。我也尝试了一些其他的策略,但没有一个真的有效。我查找了类似于Redux的replaceReducer类似的文档,但是对于redux-saga来说没有这样的东西,这让我觉得可以使用只有正确的序列来完成它。根传奇发生器。

那么,这个问题有一般的方法吗?是否可以在运行时重新实例化根传奇?

1 个答案:

答案 0 :(得分:0)

您似乎可以将端点URL添加到状态树,并根据典型的redux-saga流管理更新URL。然后,当您调度REQUEST操作时,只需从状态树中读取当前端点URL,并将其作为有效负载附加到REQUEST操作。然后,在你的api saga中,使用该URL有效负载。