2016-11-08 4 views
0

В моем сценарии пользователь может выкупить ваучеры. Пока она не вошла в систему, она все еще может проверить функцию выкупа, чтобы понять, как она работает.Переключение между двумя потоками редукционной саги

У меня 2 потоков, notLoggedInRedeemFlow для случая, когда она не регистрируется и loggedInRedeemFlow в случае, если она входит в систему.

я на корневую саге, которая должна начать один поток и остановить другой на основе состояние входа в систему.

Я придумал гонку между одним потоком и действие cancellation для этого потока.

При запуске приложения notLoggedInRedeemFlow активен, и это должно закончиться, когда пользователь входит в систему.

Затем loggedInRedeemFlow запускается и работает до тех пор, пока пользователь не выйдет из системы.

function* redeemFlows() { 
    while (true) { 
    const result = yield race({ 
     fake: call(notLoggedInRedeemFlow), 
     gotAccessToken: take([accountActions.LOGIN_SUCCESS, accountActions.START_SIGNUP_SUCCESS]), 
    }) 
    yield race({ 
     run: call(loggedInRedeemFlow, result.gotAccessToken.payload.access_token), 
     logout: take(accountActions.LOGOUT_SUCCESS), 
    }) 
    } 
} 

Мои вопросы: если это лучший способ справиться с таким сценарием в редукс-сагах?

ответ

0

Если я правильно понимаю ваш вариант использования, то я считаю, что вам нужно действие REDEEM, которое уволено из пользовательского интерфейса и сага, которая интерпретирует, вошли ли вы в систему или нет. Если вы вошли в систему, затем выполните PUT a REDEEM_LOGGED_IN действие, иначе PUT a REDEEM_NOT_LOGGED_IN. И были бы суб-саги, которые обрабатывали бы те действия REDEEM_LOGGED_IN и REDEEM_NOT_LOGGED_IN соответственно.

import {takeLatest} from 'redux-saga'; 

export default function* rootSaga() { 
    yield takeLatest('REDEEM', handleGenericRedeem); 
    yield takeLatest('REDEEM_NOT_LOGGED_IN', handleRedeemNotLoggedIn); 
    yield takeLatest('REDEEM_LOGGED_IN', handleRedeemLoggedIn); 
} 

Точные названия действий и использование takeLatest зависит от вас и вашего конкретного варианта использования. Вам может и не понадобиться takeLatest, но фрагмент кода должен дать вам представление о том, как решить проблему одним способом.