2017-02-01 11 views
0

У меня есть приложение 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, но нет ничего подобного для редукс-саги, что заставляет меня чувствовать, что это можно сделать, используя только правильную последовательность, получаемую корневым генератором саги.

Итак, существует ли общий подход к этой проблеме? Возможно ли повторное создание корневой саги во время выполнения?

ответ

0

Кажется, что вы можете добавить URL-адрес конечной точки в дерево состояний и управлять обновлением URL-адреса на основе типичного потока редукции-саги. Затем, когда вы отправляете свои действия REQUEST, просто прочитайте текущий URL конечной точки из дерева состояний и прикрепите это как полезную нагрузку к действию REQUEST. Затем, в своей api-саге, используйте эту полезную нагрузку URL.

 Смежные вопросы

  • Нет связанных вопросов^_^