Переключение между двумя потоками редукса-саги

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

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

Другие вопросы по тегам