Переключение между двумя потоками редукса-саги
В моем сценарии пользователь может использовать ваучеры. Пока она не вошла в систему, она все еще может протестировать функцию погашения, чтобы понять, как она работает.
У меня 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),
})
}
}
Мои вопросы, если это лучший способ справиться с таким сценарием в Redux-Sagas?
1 ответ
Если я правильно понимаю ваш сценарий использования, то я считаю, что вам нужно действие REDEEM, которое запускается из пользовательского интерфейса, и сага, которая интерпретирует, вошли ли вы в систему или нет. Если вы вошли в систему, тогда PUT действие REDEEM_LOGGED_IN, в противном случае PUT действие 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, но фрагмент кода должен дать вам представление о том, как можно решить проблему одним способом.