我有一个可以连接到不同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来说没有这样的东西,这让我觉得可以使用只有正确的序列来完成它。根传奇发生器。
那么,这个问题有一般的方法吗?是否可以在运行时重新实例化根传奇?
答案 0 :(得分:0)
您似乎可以将端点URL添加到状态树,并根据典型的redux-saga流管理更新URL。然后,当您调度REQUEST操作时,只需从状态树中读取当前端点URL,并将其作为有效负载附加到REQUEST操作。然后,在你的api saga中,使用该URL有效负载。