переключение между двумя потоками redux-saga

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

У меня есть 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),
    })
  }
}

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


person philk    schedule 08.11.2016    source источник


Ответы (1)


Если я правильно понимаю ваш вариант использования, то я считаю, что вам нужно действие REDEEM, которое запускается из пользовательского интерфейса, и сага, которая интерпретирует, вошли ли вы в систему или нет. Если вы вошли в систему, то ПОСТАВЬТЕ действие REDEEM_LOGGED_IN, иначе ПОСТАВЬТЕ действие 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, но фрагмент кода должен дать вам представление о том, как можно решить проблему одним из способов.

person epikhighs    schedule 07.01.2017