Этот вопрос закрыт для ответов, так как повторяет вопрос Как лучше спроектировать eventChannel для получения данных с чата?
@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 в других сагах.
Вопрос почему так?
  • Вопрос задан
  • 106 просмотров
Решения вопроса 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));
            },
        };
Ответ написан
Ваш ответ на вопрос

Вопрос закрыт для ответов и комментариев

Потому что уже есть похожий вопрос.
Похожие вопросы