在两个redux-saga流之间切换

时间:2016-11-08 11:50:27

标签: redux-saga

在我的场景中,用户可以兑换优惠券。虽然她没有登录,但她仍然可以测试兑换功能以了解其工作原理。

我有2个流量,notLoggedInRedeemFlow用于未登录的情况,loggedInRedeemFlow以防她登录。

我有root saga,应该根据用户登录状态启动一个流并停止另一个流。

我想出了一个流与一个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 个答案:

答案 0 :(得分:0)

如果我正确理解您的用例,那么我相信您需要从UI触发的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,但代码片段应该让您了解如何以一种方式解决问题。