У меня есть приложение React Native, которое может подключаться к различным конечным точкам API. Некоторым пользователям может потребоваться изменить конечную точку API во время выполнения без перезапуска приложения. Все запросы API связаны с сагами, а корень сага выглядитКак заменить саги во время выполнения?
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
искоренить сагу в качестве первого аргумента:
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
});
];
Но это не сработало. Я также пробовал кучу других тактик, но ни один из них не работал. И я просмотрел документы для чего-то подобного Redx's replaceReducer
, но нет ничего подобного для редукс-саги, что заставляет меня чувствовать, что это можно сделать, используя только правильную последовательность, получаемую корневым генератором саги.
Итак, существует ли общий подход к этой проблеме? Возможно ли повторное создание корневой саги во время выполнения?