@dufrein2013

Как сделать put экшена в колбеке с помощью redux saga и если нужно event channel?

Добрый день гуру redux saga) Только начал её осваивать...
Возникла задача сделать аутентификацию на сайте используя VK OpenApi. При этом для логики используется redux saga. Для этого была сделана сага *someSaga в которой вызывается vk.api.call, в колбеке которого хорошо было бы вызвать yield put(someAction()), но это невозможно,т.к. колбек это не генератор.
Прочитал что можно использовать redux saga event channel: сделал отдельную функцию someFunction, где возвращаю eventChannel (как описано в доках redux saga и в нем делаю emit(data) тех данных которые мне вернул vk.api), далее вызываю её в созданной ранее саге с помощью
const callVkChannel = yield call(()=>someFunction())
const data = yield take(callVkChannel ) (и в data успешно записывается данные авторизации)
но при этом, туда же каким-то боком попадают всех остальные экшены, которые отправляются с помощью put в других сагах.
Вопрос почему так?
  • Вопрос задан
  • 41 просмотр
Решения вопроса 1
@Bone
Была похожая проблема. Я решил, что самым простым способом будет дёргать store.dispatch напрямую, а не через put.

1. Передаем store.dispatch в корневую сагу:

const sagaMiddleware = createSagaMiddleware();
const store = configureStore({
    reducer: {
        app: VkAppReducer,
    },
    middleware: [
        sagaMiddleware,
    ],
});
sagaMiddleware.run(rootSaga, store.dispatch);


2. Из корневой саги, передаем dispatch в дочерние

function* rootSaga(dispatch) {
    yield spawn(ChildSaga, dispatch);
}


3. В дочерней саге можем использовать dispatch в коллбеке:
const params: MethodParams = {
            group_id: 1,
            access_token: access_token,
            onProgress: (s: string) => {
                dispatch(setProgress(s));
            },
        };
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Spice IT Recruitment Москва
До 200 000 ₽
Почта Банк Москва
от 200 000 до 235 000 ₽
SaveTime Москва
от 160 000 до 230 000 ₽
08 апр. 2020, в 00:40
15000 руб./за проект
07 апр. 2020, в 23:31
50000 руб./за проект